我在bash中有以下脚本:
ssh user@1.1.1.1 "echo 'start'
mkdir -p /home/user/out
cp /tmp/big_file /home/user/out
echo 'syncing flash'
sync
while [[ $(cat /proc/meminfo | grep Dirty | awk '{print $2}') -ne 0 ]] ; do
echo \"$(cat /proc/meminfo)\"
sleep 1
sync
done
echo 'done'"
我有我的主机PC和要复制到的目标PC。在运行此脚本之前,我已经将一个大文件scp到目标的/ tmp中。
当我运行此脚本时,它会复制文件/ tmp / big ok,但是当它进入循环以同步闪存时,我等待meminfo Dirty
归零,我看到的总是{{1 }}在循环中重复。
但是在另一个登录到目标的ssh会话中,我正在运行它:
Dirty: 74224 kB
我看到这个计数从〜74000kb减少到0kB。
区别在于,执行watch -n1 "cat /proc/meminfo | grep Drity"
的ssh会话以root用户身份登录,而ssh则登录到watch
中。
因此,我以user
登录的ssh shell进行了相同的测试,并且在Drity中始终看到0kb ...
这是否意味着user
无法读取与整个系统有关的meminfo? -如何知道何时以非root用户身份同步了闪存?
答案 0 :(得分:4)
由于ssh
的参数用双引号引起来,因此变量和命令替换在发送命令之前已在客户端上本地扩展,因此它们不会在远程计算机上完成。由于它们是在客户端上替换的,因此每次循环显然会得到相同的结果(因为客户端没有在循环)。
您应该转义$
字符以便将其发送到服务器,或者将命令放在单引号中(但是后者会使在命令中包括单引号变得困难)。
ssh user@1.1.1.1 "echo 'start'
mkdir -p /home/user/out
cp /tmp/big_file /home/user/out
echo 'syncing flash'
sync
while [[ \$(awk '/Dirty/ {print \$2}' /proc/meminfo) -ne 0 ]] ; do
cat /proc/meminfo
sleep 1
sync
done
echo 'done'"
在命令替换中也不需要cat /proc/meminfo
和grep Dirty
。 awk
可以进行模式匹配并接受文件名参数。