通过SSH传递Bash命令 - 执行变量捕获

3

我正在通过SSH直接传递以下命令:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /key/path server@111.111.111.111 'bash -s' << EOF
FPM_EXISTS=`ps aux | grep php-fpm`
if [ ! -z "$FPM_EXISTS" ]
then
        echo "" | sudo -S service php5-fpm reload
fi
EOF

I get the following error:

[2015-02-25 22:45:23] local.INFO: bash: line 1: syntax error near unexpected token `('
bash: line 1: ` FPM_EXISTS=root      2378  0.0  0.9 342792 18692 ?        Ss   17:41   0:04 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)                 

它的行为类似于尝试执行ps aux | grep php-fpm命令的输出,而不仅仅是捕获变量。因此,如果我尝试将命令更改为尝试捕获ls,它会像尝试执行那个命令一样,当然会针对每个目录返回"command not found"。

如果我将Bash脚本的内容粘贴到文件中并运行它,它就可以正常工作;但是,我似乎无法弄清楚如何通过SSH传递它。

有什么想法吗?

2个回答

9

你需要将起始的EOF用单引号括起来。否则,ps aux | grep php-fpm会被本地shell所解释。

命令应该像这样:

ssh ... server@111.111.111.111 'bash -s' << 'EOF'
FPM_EXISTS=$(ps aux | grep php-fpm)
if [ ! -z "$FPM_EXISTS" ]
then
        echo "" | sudo -S service php5-fpm reload
fi
EOF

请看这里:http://tldp.org/LDP/abs/html/here-docs.html (第19.7节)。另外,我建议您在命令替换中始终使用$()而不是反引号,因为它们可以嵌套。相信我,这样会更有趣。例如,请参阅此链接以了解其好处:What is the benefit of using $() instead of backticks in shell scripts?

5

你应该用单引号包裹EOF

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /key/path server@111.111.111.111 'bash -s' << 'EOF'
FPM_EXISTS=`ps aux | grep php-fpm`
if [ ! -z "$FPM_EXISTS" ]
then
        echo "" | sudo -S service php5-fpm reload
fi
EOF

想知道与我的答案相比有什么不同之处吗?(除了缺少的解释) - hek2mgl
发表时间。(嗯,算了 - 但是差不多是同一时间。;) - thasmo
@hek2mgl,抱歉我的朋友。在我开始编写和测试我的答案时,我没有看到你已经写了什么。 - Tim Groeneveld
也不是什么“比赛”。但是,我确实看到有人抄袭帖子……对不起,怀疑你了!+1 很好的答案 ;) - hek2mgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接