2012-07-20 69 views
3

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

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

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

+0

网:: OpenSSH的准备: :Parallel可让您将输出保存到本地文件系统中。然后,您可以从脚本中重新读取并处理它。 – salva 2014-08-18 10:35:00

回答

2

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

#!/bin/bash 

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

其中myhosts是包含500多个主机名

+0

我知道我可以在普通的bash脚本中完成它,即使我不需要perl脚本,但不知何故我必须使用perl而不是bash脚本。 – user1539754 2012-07-20 05:33:51

4

您可以派生您的程序和管理的东西叉文件像Parallel :: ForkManager。然后使用Net :: OpenSSH进行SSH工作+捕获并将结果显示在屏幕上。尽管所有那些试图同时写入STDOUT/STDERR的进程都会得到乱码结果,但您需要注意IO。你需要做这样的事情,从这个问题的答案(父和子进程之间的管道):fork() and STDOUT/STDERR to the console from child processes

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