如何SSH远程Ubuntu虚拟机切换Shell至Bash及跨机执行命令报错排查
问题二:排查SSH执行命令时的"badly placed ()'s"错误
报错原因分析
这个错误大概率是远程机器的默认Shell为csh/tcsh,再加上你传递命令的方式有误,导致csh无法正确解析命令语法:
- 首先你写的
ssh ses@machineB %s clean_command是错误的,SSH传递远程命令的正确方式是将命令用引号包裹起来。 - 其次,csh的语法规则和bash差异较大,哪怕你的命令里的
source是csh也支持的命令,但当命令中包含分号这类分隔符时,csh的解析逻辑和bash不同,很容易触发语法错误——哪怕你命令里没显式写括号,也可能是csh把某些字符误解析成了括号相关的语法结构。
解决方法
方法1:强制远程用bash执行命令
最稳妥的办法是直接指定远程用bash来运行你的命令,不管远程默认Shell是什么,都能避开csh的语法坑:
clean_command="cd /ws/vprahlad-bgl/pats;source env.sh;source /auto/pysw/ats/env.sh;uname -a;python clean.py" ssh ses@machineB "bash -c '$clean_command'"
注意引号的嵌套:外层用双引号包裹bash -c '...',内层命令用单引号,防止本地Shell提前解析特殊字符。
方法2:将远程默认Shell改为bash(参考问题一的步骤)
如果以后经常需要执行这类bash风格的命令,直接把远程ses账号的默认Shell换成bash就能一劳永逸,这样后续SSH执行命令时默认用bash解析,就不会再出现csh的语法错误了。
方法3:适配csh的命令写法(不推荐)
如果必须用csh执行命令,需要调整命令写法,比如把分号换成&&(csh中&&的逻辑和bash类似),同时正确传递引号:
clean_command="cd /ws/vprahlad-bgl/pats && source env.sh && source /auto/pysw/ats/env.sh && uname -a && python clean.py" ssh ses@machineB "$clean_command"
不过这种方式可能存在隐藏的语法问题,优先推荐前两种方法。
内容的提问来源于stack exchange,提问作者Vadiraj
相关产品推荐
相关产品推荐

