通过 SSH 传递 Bash 命令 - 执行变量捕获
Passing Bash Command Through SSH - Executing Variable Capture
我直接通过 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
我收到以下错误:
[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
的输出,而不是仅仅捕获 git 变量。因此,如果我更改命令以尝试捕获 ls
,它的行为就像它也尝试执行该命令一样,当然会为每个目录返回 "command not found"。
如果我只是将 Bash 脚本的内容粘贴到一个文件中,然后 运行 它就可以正常工作;但是,我似乎无法弄清楚如何通过 SSH 传递它。
有什么想法吗?
您需要用单引号将 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?
您应该将 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
我直接通过 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
我收到以下错误:
[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
的输出,而不是仅仅捕获 git 变量。因此,如果我更改命令以尝试捕获 ls
,它的行为就像它也尝试执行该命令一样,当然会为每个目录返回 "command not found"。
如果我只是将 Bash 脚本的内容粘贴到一个文件中,然后 运行 它就可以正常工作;但是,我似乎无法弄清楚如何通过 SSH 传递它。
有什么想法吗?
您需要用单引号将 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?
您应该将 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