模糊的bash语法错误

dan*_*ast 2 ssh bash

我在这里找不到我的语法问题:

» 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'
Run Code Online (Sandbox Code Playgroud)

编辑

要验证我的内联脚本是否有效:

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

myhost.mydomain.net
myhost.mydomain.net
myhost.mydomain.net
Run Code Online (Sandbox Code Playgroud)

Tob*_*ght 5

实际上,SSH将命令传递给远程端的方式存在问题.比较这些例子:

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

+ echo
2
3
Run Code Online (Sandbox Code Playgroud)
$ ssh localhost bash -x -c "'echo 1; echo 2; echo 3'"
1
2
3
+ echo 1
+ echo 2
+ echo 3
Run Code Online (Sandbox Code Playgroud)

理解这个问题的关键是SSH从其参数重构命令行,并且它做得很糟糕.它只是使用空格将参数粘贴在一起,如果我们使用-v选项运行上面的两个命令就可以看出:

分别.

显然,第一个是在(在远程shell中)运行的

bash -x -c "echo" 1
echo 2
echo 3
Run Code Online (Sandbox Code Playgroud)

这就是我们上面看到的.

简而言之,您需要为远程shell提供引号.

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

ssh bootstrap01 'for master in master01 master02 master03 ; do ssh root@$master -i .ssh/master hostname ; done'
Run Code Online (Sandbox Code Playgroud)