清除多個遠端主機上 ssh 指令的陷阱

清除多個遠端主機上 ssh 指令的陷阱

我想使用 ssh 在多個遠端主機上執行任意命令。這些命令大多是長時間運行的命令,用於監視伺服器資源並將輸出聚合到我的本機工作站(例如tail -fmpstattcpdump/tcpflowgrep)。

問題是我還沒有找到一種方法來保持命令運行,同時稍後可靠地終止所有主機的 SSH 連線和遠端命令。

我嘗試了許多ssh標誌變體,等待、貓、讀取、陷阱等...要么兩者都立即被終止,本地終端被卡住,要么遠端命令在 ssh 連接被終止後繼續在遠端主機上運行。

這就是我現在所擁有的。

function server_ssh() {
  pids=""
  for box in 01 02 03; do
    ssh -t -t -f server$box "$1" &
    pids="$pids $!"
  done
  trap 'kill -9 $pids' SIGINT
  # wait, cat, read ??
}

答案1

看起來像是一些東西gnu並行。試試這樣的事情:

function server_ssh() {
  parallel --line-buffer ssh server{} "$1" ::: 01 02 03
}

--line-buffer需要選項來允許將不同命令的輸出混合在一起(預設情況下它將每個命令的輸出分組在一起,因此必須等到每個命令完成顯示)。

-u也應該在這裡工作。通常,它可能允許部分行混合在一起,但由於您使用的命令可能是基於行的,所以這種情況不應該發生。

編輯:--line-buffer我的版本(20130922-1)正在進行 alpha 測試,我會選擇-u.

相關內容