Shell脚本SSH登录远程VM执行命令返回本地结果问题求解
问题原因
你当前脚本中here-doc内的$(ls)没有做转义处理,本地Shell会在通过SSH发送命令内容前,优先在本地执行命令替换,把$(ls)替换成本地当前目录的文件列表再传给远程主机,最终你看到的就是本地的执行输出。
正确实现方式
最稳妥的方案是给here-doc的分隔符EOF加单引号,告诉本地Shell不要解析、替换脚本块内的任何变量、命令替换逻辑,所有内容原封不动传给远程VM执行:
ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no root@$1 <<'EOF' cd /var echo "$(ls)" EOF exit
补充:如果只是需要获取
/var目录下的文件列表,不需要额外套echo,直接在cd /var后写ls即可拿到相同结果。
其他可选方案
如果不想修改EOF的标记,也可以单独对命令替换的$符号做转义,阻止本地提前执行替换:
ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no root@$1 <<EOF cd /var echo "\$(ls)" EOF exit
这种方式适合脚本块里同时需要本地变量替换、远程命令执行的场景,但是如果块内需要远程执行的命令替换、变量较多,很容易漏写转义符,优先推荐给EOF加引号的写法。
内容的提问来源于stack exchange,提问作者Snehal Gupta
相关产品推荐
相关产品推荐

