通过SSH写入多个远程终端

时间:2018-02-09 07:39:31

标签: linux bash ssh

我们说我是SSH和多台远程机器。我想通过一个界面向所有机器发送命令。我正在考虑打开一个命名管道,其输出将通过管道输送到我连接到的每台机器。这样,如果我echo "ls -l" > namedpipe,那么命令将在每台机器上运行。我尝试过这个,但它没有用。关于如何有一个终端可以与所有远程机器进行交互的任何建议?

2 个答案:

答案 0 :(得分:1)

有很多工具可以帮助你做到这一点。其中一些值得检查的是:

pssh
Ansible Ad-Hoc module

他们都通过SSH工作。

如果您仍希望将自定义脚本与SSH客户端一起使用,则可以执行以下操作:

while read i
do
    ssh user@$i <command to execute> <arg>
done < server.list

答案 1 :(得分:1)

GNU Parallel是要走的路。在SO和其他地方有很多例子,在需要时也使用命名管道。在并行手册页中提到并比较了其他工具。

至于你的例子,你想要的就像

一样
parallel ssh {} "ls -l" ::: user1@machine1 user2@machine2 ...

某些Linux发行版附带了一个配置文件(通常为/etc/parallel/config),其中默认设置了选项--tollef。如果是这种情况并且您不想更改,则必须在上面的第一个示例中使用--而不是:::,或者使用--gnu选项覆盖{ {1}}。

等效地,如果您创建一个名为--tollef的文件,其中包含

remotelist

你可以发出:

user1@machine1
user2@machine2

或者,如下面的评论所述,

parallel -a remotelist ssh {} "ls -l"

parallel --nonall --slf remotelist ls -l 选项(--slf的缩写)允许在--sshloginfile文件中填充更多信息:注释,在每个远程主机上使用的处理器数量等。

您可能还会考虑remotelist选项,该选项会在每个输出行前面添加它所源自的主机的名称。