ssh远程执行块中的指令首先在客户端本地进行评估.为什么?



为什么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

最新更新