模糊的bash语法错误

时间:2016-09-29 08:17:32

标签: 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 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

1 个答案:

答案 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'