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

Tay*_*ell 3 ssh bash

我直接通过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
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

这就像它试图执行输出ps aux | grep php-fpm而不是仅仅捕获git变量.因此,如果我更改命令以尝试捕获ls,它就像尝试执行它一样,当然返回每个目录的"command not found".

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

有任何想法吗?

hek*_*mgl 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
Run Code Online (Sandbox Code Playgroud)

请查看:http://tldp.org/LDP/abs/html/here-docs.html(第19.7节)


顺便说一句,我鼓励你使用$()而不是反引号来代替命令,因为它能够嵌套它们.相信我,你会有更多的乐趣.例如,检查一下:在shell脚本中使用$()而不是反引号有什么好处?


Tim*_*eld 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
Run Code Online (Sandbox Code Playgroud)