我无法在此处找到语法问题:
» 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
答案 0 :(得分:5)
SSH将命令传递到远程端的方式确实存在问题。比较这些例子:
$ ssh localhost bash -x -c 'echo 1; echo 2; echo 3'
+ echo
2
3
$ ssh localhost bash -x -c "'echo 1; echo 2; echo 3'"
1
2
3
+ echo 1
+ echo 2
+ echo 3
理解这个问题的关键是SSH从其参数重建一个命令行,并且它做得很糟糕。它只是使用空格将参数粘贴在一起,如果我们使用-v
选项运行上面的两个命令就可以看出:
debug1: Sending command: bash -x -c echo 1; echo 2; echo 3
debug1: Sending command: bash -x -c 'echo 1; echo 2; echo 3'
分别
显然,第一个是(在远程shell中)运行
bash -x -c "echo" 1
echo 2
echo 3
这就是我们上面所看到的。
简而言之,您需要为远程shell提供引号。
在您的情况下,您可能只能省略bash -c
,因为您的命令中没有标准外壳不会像以下那样:
ssh bootstrap01 'for master in master01 master02 master03 ; do ssh root@$master -i .ssh/master hostname ; done'