需求及目标
从A机器通过SSH方式到B机器,并执行相关的命令。命令中包含变量及变量的赋值。
代码如下,意思是,ssh到10.111.111.27这台机器,cd到 / 根目录下,并执行ls命令,如果ls出来的结果不为空,则执行echo命令。可以肯定的是 / 根目录下是有内容的。
ssh -i /root/.ssh/private_key -tt -o StrictHostKeyChecking=no rbadmin_app1@10.161.238.27 << eof
cd /
LSRESULT="$(ls)"
echo $LSRESULT
exit
eof
可以看到当执行到 echo 命令的时候,输出的是空,这就很奇怪。
问题产生的原因
只是因为我们将远程执行的命令和变量赋值语句放在了 SSH 的输入重定向中 (<< eof … eof)。在这种情况下,脚本中的变量赋值语句将在本地 Shell 中执行,而不是远程机器上。也就是说变量赋值语句其实不会在你远程执行的这台机器上去执行,而且等到ssh命令完成后,回到机器A上后去执行,实际 ls 命令执行的路径是机器A在ssh命令时所在的路径。
问题的解决
ssh -i /root/.ssh/private_key -tt -o StrictHostKeyChecking=no rbadmin_app1@10.161.238.27 << eof
cd /
LSRESULT="\$(ls)"
echo \$LSRESULT
exit
eof
可以看到此时,执行echo命令时,就输出了远程机器上执行的ls命令。修改的地方很简单,在执行的语句外层的$符号前加上反斜杠 \ , 在引用的变量上加上反斜杠 \ 即可。这是由于命令和变量在远程机器上执行,因此需要使用 \ 进行适当的转义,以确保变量能够正确地被解析和赋值。