如何在远程服务器上执行任意长输出的命令然后停止?

如何在远程服务器上执行任意长输出的命令然后停止?

我知道我可以在远程服务器上执行命令(请参阅这个问题)。

我想在多个远程服务器上执行一个命令(可能使用脚本循环遍历所有服务器?),其中命令的输出将具有任意长的输出(即,直到我按下 ,输出才会停止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

您尝试过循环吗sshfor您可以终止每个命令,并且循环将继续进行。

[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.

相关内容