通过 ssh 杀死远程进程

chr*_*ise 3 process ssh kill remote quoting

我有一个要远程终止的进程。我试过

ssh remotehost "kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')"
Run Code Online (Sandbox Code Playgroud)

但这会返回错误

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Run Code Online (Sandbox Code Playgroud)

但是,如果我在引号内运行命令

kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)

在远程主机上它工作正常。我在这里错过了什么吗?

Ini*_*ian 6

$(..)作为命令替换将失败$是由连本地shell扩展之前,它被传递给stdin了的ssh命令。您要么需要对其进行转义,要么使用此处的字符串。

此外awk,打印$2中的命令被插入为命令行参数。所以我们转义它以推迟它的扩展,直到命令被远程执行。

随着逃避,

ssh remotehost "kill -9 \$(ps -aux | grep foo | grep bar | awk '{print \$2}')"
Run Code Online (Sandbox Code Playgroud)

或使用 here-doc

ssh remotehost <<'EOF'
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
EOF
Run Code Online (Sandbox Code Playgroud)

还要注意,这grep .. | grep .. | awk是多余的。您可以awk单独完成整个操作。或者甚至更好地使用pkill让进程直接按名称杀死。