透過 ssh 殺死遠端進程

透過 ssh 殺死遠端進程

我有一個想要遠端終止的進程。我試過

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}')

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

答案1

命令$(..)替換將會失敗,因為$即使本地 shell 擴展了它被傳遞給命令stdinssh。您要么需要轉義它,要么使用here-string。

awk此外,列印中的命令$2也會作為命令列參數進行插值。因此,我們對其進行轉義以推遲其擴展,直到遠端執行命令為止。

隨著逃跑,

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

或使用此處文檔

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

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

答案2

這對我殺死一組主機有用:

for i in `cat hostlist`;do ssh -q $i kill `ssh -q $i ps -ef | grep <process name>|awk '{print $2}'`;done  

答案3

你可以選擇做類似的事情

ssh remotehost "killall -r 'foo.*bar'"

相關內容