![清除多个远程主机上 ssh 命令的陷阱](https://linux22.com/image/57145/%E6%B8%85%E9%99%A4%E5%A4%9A%E4%B8%AA%E8%BF%9C%E7%A8%8B%E4%B8%BB%E6%9C%BA%E4%B8%8A%20ssh%20%E5%91%BD%E4%BB%A4%E7%9A%84%E9%99%B7%E9%98%B1.png)
我想使用 ssh 在多个远程主机上执行任意命令。这些命令大多是长时间运行的命令,用于监视服务器资源并将输出聚合到我的本地工作站(例如tail -f
、mpstat
或tcpdump
/tcpflow
等grep
)。
问题是我还没有找到一种方法来保持命令运行,同时稍后可靠地终止所有主机的 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
.