2012-07-20 70 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

並行編程比串行更難,所以要對一些樂趣:)