我知道我可以在远程服务器上执行命令(请参阅SO上的这个问题 )。
我想在多个远程服务器上执行一个命令(可能使用一个脚本来循环所有这些命令?)命令的输出将有任意长的输出(即输出不会停止,直到我按Ctrl + C )。 我也希望能够停止运行该命令执行的远程服务器上的程序。
如何在任意数量的远程服务器上执行本地机器上的命令,其中(1)命令的输出长度不确定,(2)命令可终止?
让我们做一个循环中的所有主机,并且轻松一下,您可能希望在它自己的xterm中执行每个ssh。 所以我们可以像这样使用一行代码:
for host in host1 host2 host3; do xterm -e ssh $host -t "echo -e '\033];$host\07'; YOUR_COMMAND >/tmp/$host.log 2>&1& tail -f /tmp/$host.log"& done
它的部分简短的解释:
>/tmp/$host.log 2>&1将您的输出redirect到一个文件 – 也许您想稍后收集它。
远程命令中的回显部分将发送一个转义序列,将xterm标记为主机名。 所以如果你有50个,你还是知道是什么。
2>&1将错误输出redirect到相同的日志文件。
主机上的下一个&背景YOUR_COMMAND,所以尾巴可以显示它的输出给你。
最后一个&将本地xterm命令发送到后台,所以您可以一次有很多。
当然,你可能会忽略所有那些“复杂”的东西,只要看看你的xterms,当你看到足够多的时候,
for host in host1 host2 host3; do xterm -e ssh $host -t YOUR_COMMAND& done
那么,如果你不需要长时间的输出和Ctrl + C的中断,我会build议你。 但是在这种情况下,它更像是一个多terminal的工作,比如终结者:
https://gnometerminator.blogspot.cz/p/introduction.html
它将你写入terminal的内容复制到别人(当启用此选项时)。
你有没有尝试通过循环的ssh ? 你可以终止每一个命令,循环将进一步。
[root@hostXYZ scripts]# for vm in host1 host2 host3; do ssh -t root@$vm "echo test; read"; done test ^CConnection to host1 closed. test ^CConnection to host2 closed. test ^CConnection to host3 closed. [root@hostXYZ scripts]# for vm in host1 host2 host3; do ssh -t root@$vm "echo test; read"; done test Connection to host1 closed. test Connection to host2 closed. test Connection to host3 closed.