隐藏bash语法错误

隐藏bash语法错误,bash,ssh,Bash,Ssh,我无法在此处找到语法问题: » ssh bootstrap01 bash -c 'for master in master01 master02 master03 ; do ssh root@$master -i .ssh/master hostname ; done' bash: -c: line 0: syntax error near unexpected token `do' bash: -c: line 0: `bash -c for master in master01 master

我无法在此处找到语法问题:

» ssh bootstrap01 bash -c 'for master in master01 master02 master03 ; do ssh root@$master -i .ssh/master hostname ; done'
bash: -c: line 0: syntax error near unexpected token `do'
bash: -c: line 0: `bash -c for master in master01 master02 master03 ; do ssh root@$master -i .ssh/master hostname ; done'
编辑 要验证我的联机脚本是否有效,请执行以下操作:

$ for master in localhost localhost localhost ; do ssh $master hostname ; done

myhost.mydomain.net
myhost.mydomain.net
myhost.mydomain.net

实际上,SSH将命令传递到远程端的方式存在问题。比较以下示例:

$ ssh localhost bash -x -c 'echo 1; echo 2; echo 3'

+ echo
2
3
理解这个问题的关键是SSH根据其参数重建命令行,但它做得很糟糕。它只是使用空格将参数粘贴到一起,如果我们使用
-v
选项运行上面的两个命令,就可以看到:

分别

显然,其中第一个是按如下方式运行的(在远程shell中)

这就是我们在上面看到的

简而言之,您需要为远程shell提供报价

在您的情况下,您可能可以省略
bash-c
,因为您的命令中没有标准shell不喜欢的内容:

ssh bootstrap01 'for master in master01 master02 master03 ; do ssh root@$master -i .ssh/master hostname ; done'

您是否考虑过使用
ProxyCommand
转发SSH?@IgnacioVazquez Abrams:谢谢您的想法,但我想了解我的语法问题在哪里
bash-c“xxx”
明确地告诉ssh使用bash运行一个内嵌脚本。内联脚本本身是正确的。那么问题出在哪里呢?引用?很好,删除
bash-c
解决了这个问题。我以为我是在让事情变得更好,实际上是在让事情变得更糟
debug1: Sending command: bash -x -c echo 1; echo 2; echo 3
debug1: Sending command: bash -x -c 'echo 1; echo 2; echo 3'
bash -x -c "echo" 1
echo 2
echo 3
ssh bootstrap01 'for master in master01 master02 master03 ; do ssh root@$master -i .ssh/master hostname ; done'