清除多个远程主机上 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.

相关内容