Ssh

通過 ssh 殺死遠端程序

  • August 31, 2020

我有一個想遠端殺死的程序。我試過

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

但這會返回錯誤

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

但是,如果我在引號內執行命令

kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')

在遠端主機上它工作正常。我在這裡錯過了什麼嗎?

$(..)命令替換將失敗,因為本地$shell 甚至它被傳遞給stdin命令之前就對其進行了擴展ssh。您要麼需要對其進行轉義,要麼使用此處的字元串。

awk列印中的命令也$2被插入為命令行參數。所以我們逃避它以推遲它的擴展,直到命令被遠端執行。

隨著逃避,

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

或使用 here-doc

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

另請注意,這grep .. | grep .. | awk是多餘的。awk您可以單獨完成整個操作。或者甚至更好地使用pkill直接按名稱殺死程序。

引用自:https://unix.stackexchange.com/questions/496381