2016-11-22 149 views
0

当试图通过ssh运行以下命令:错误通过ssh运行bash命令时

ssh hostname 'for pid in $(ps -ef | grep "some process" | awk '{print $2}'); do kill -9 $pid; done'

我得到以下错误:

awk: cmd. line:1: {print 
awk: cmd. line:1:  ^unexpected newline or end of string 

我试着用不同的方式逃脱但还没有找到正确的方法 - 或者也许是别的?

提前致谢!

+1

在这种情况下,您可以使用'pkill -f“某个进程”'。 – ymonad

+0

这不会杀死所有具有特定名称的进程,是不是? –

回答

3

您不能在单引号字符串中包含单引号,因为除了关闭字符串的单引号之外没有任何内容被解释。你可以用"'"置单引号字符串:

ssh host 'for pid in $(ps -ef | grep "some process" | awk '"'"'{print $2}'"'"'); do kill -9 $pid; done' 

另外,串联逃脱单引号(\'):

ssh host 'for pid in $(ps -ef | grep "some process" | awk '\''{print $2}'\''); do kill -9 $pid; done' 

Strong Quoting

你的命令解释为一对夫妇的$IFS - 分隔参数的错误的原因:

  • for pid in $(ps -ef | grep "some process" | awk {print
  • }); do kill -9 $pid; done

有中没有$2字符串,因为$2被解释为一个shell变量,并且这个变量在普通shell上下文中的值是空的。

因此,您发送以下命令到服务器:

for pid in $(ps -ef | grep "some process" | awk {print }); do kill -9 $pid; done 

如果在终端运行此命令,你会从AWK得到同样的错误。

+0

正如@ymonad在上面的一个注释中指出的那样,** pkill **命令将减少引用问题:'ssh host'pkill -KILL -f“某个进程”“'......只要文本**'当然,某些进程**不包括任何引号。 – Jdamian