3

我正在尝试在 perl 中创建一个脚本,它可以 ssh 到多个主机(500+),执行所需的命令,并在屏幕上显示输出。我已经使用 Net::OpenSSH 模块完成了这项工作,因为 ssh-keys 没有配置,我也不允许配置这些。所以,我必须使用一个可以在做 ssh 时提供密码的东西。

由于连接很多,做这件事需要相当长的时间。我搜索了“perl 中的并行 ssh”,发现有一个用于打开并行 ssh 的模块(Net::OpenSSH:Parallel),但我在一些论坛上的某处读到,我无法使用该模块捕获输出,就像我可以使用 Net 捕获一样::OpenSSH ($ssh->caputre(ls))。

那么,我怎样才能以更方便的方式完成并行 ssh 呢?另外,我欢迎任何其他可以用来节省时间的建议。在线程中使用 Net:OpenSSH 会节省我的时间,还是会像并行一样工作?

4

2 回答 2

4

您可以分叉您的程序并使用 Parallel::ForkManager 之类的东西来管理分叉。然后使用 Net::OpenSSH 进行 SSH 工作 + 捕获并将结果显示到屏幕上。你需要小心你的 IO,因为所有那些试图同时写入 STDOUT/STDERR 的进程都会得到乱码的结果。您需要执行类似于此问题的答案(父进程和子进程之间的管道):fork() 和 STDOUT/STDERR 从子进程到控制台

并行编程比串行编程更难,所以要准备好一些乐趣:)

于 2012-07-20T14:39:35.017 回答
2

一种方法是使用 shell 脚本来执行你的 perl 脚本:

#!/bin/bash

for host in $(cat myhosts)
do
  perl myperl.pl $host $1 $2 &
done 

其中 myhosts 是一个包含 500 多个主机名的文件

于 2012-07-20T05:14:04.837 回答