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}')
在遠端主機上它工作正常。我在這裡錯過了什麼嗎?
$(..)
命令替換將失敗,因為本地$
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
直接按名稱殺死程序。