为什么ssh远程执行块中的指令首先在客户端本地评估?
考虑以下代码:
ssh -tt serverhostname "
if [ `grep -cm 1 "string" /serverside/file`!= "1" ]; then
echo "Doing some action on" `date`
fi
" 2> /dev/null
人们可能期望ssh块中列出的指令在远程上执行。事实并非如此。if语句实际上是在客户端执行的。为什么?是否有语法正确的方法来处理指令服务器端(在远程)?
在调用命令之前展开未引用和双引用的参数:
ssh server "echo $HOSTNAME"
与相同
ssh server "echo clienthostname"
并将文字串CCD_ 1发送给服务器。因此,服务器会写出客户端的主机名。
同时,单引号和转义的论点没有扩展:
ssh server 'echo $HOSTNAME'
ssh server "echo $HOSTNAME"
将向服务器发送文本字符串echo $HOSTNAME
,并因此导致服务器写出服务器的主机名。
这适用于所有命令,与ssh无关。
我问这个问题也许是为了帮助其他有同样困境的人。您希望在服务器上执行某个指令,并将该指令的值作为其他指令的基础。但是您发现服务器没有执行指令。
Bash实际上是在客户端执行注入的指令。我发现的唯一解决方案是发出单独的命令并将结果存储在客户端。即
# Step 1
a=`ssh server grep -cm 1 "something" /serverside/file`
# Step 2
if [ $a != "1" ]; then
ssh -tt server "
echo "perform some series of tasks"
"
fi