我知道我可以在远程服务器上执行命令(请参阅这个问题)。
我想在多个远程服务器上执行一个命令(可能使用脚本循环遍历所有服务器?),其中命令的输出将具有任意长的输出(即,直到我按下 ,输出才会停止Ctrl + C
)。我还希望能够停止在执行此命令的远程服务器上运行该程序。
如何从我的本地机器在任意数量的远程服务器上执行命令,其中(1)该命令具有不确定的输出长度,并且(2)该命令是可终止的?
答案1
让我们循环执行所有主机,为了方便起见,您可能希望在自己的 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
将您的输出重定向到文件 - 也许您想稍后收集它。
远程命令中的 echo 部分发送一个转义序列,用主机名标记您的 xterm。因此,如果您有 50 个 xterm,您仍然知道哪个是哪个。
2>&1
将错误输出重定向到同一个日志文件。
下一个&
在主机上设置 YOUR_COMMAND 的背景,因此 tail 可以向您显示它的输出。
最后一个&
将本地 xterm 命令发送到后台,因此您可以同时拥有多个命令。
当然,你可以忽略所有那些“复杂”的东西,只要观察你的 xterms 并且当你看得足够多时在每个 xterms 中按 ^C 即可:
for host in host1 host2 host3; do xterm -e ssh $host -t YOUR_COMMAND& done
答案2
好吧,如果你不需要长输出和 Ctrl+C 中断,我建议你使用 ansible。然而在这种情况下,它看起来更像是一些多控制台的工作,比如 terminator:
https://gnometerminator.blogspot.cz/p/introduction.html
它将您写入的内容复制到其中一个终端以允许其他终端(当启用此选项时)。
答案3
您尝试过循环吗ssh
?for
您可以终止每个命令,并且循环将继续进行。
[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.