2011-09-12 57 views
1

我不知道如何最好地把它,但這裏是我的問題: 我有兩臺機器,客戶端A和服務器B. 我的客戶端已通過身份驗證並且不需要密碼就可以正常連接到B.當我從A到B執行ssh時,它將無需密碼登錄。服務器提示輸入密碼儘管ssh密鑰安裝時使用並行:ForkManager

但是, 當我使用Parallel :: Forkmanager模塊使用多個並行連接時,它有時會要求輸入密碼。

下面是我用來建立連接的代碼: 代碼: 使用Parallel:ForkManager;

my $pm=new Parallel::ForkManager(15); 
foreach my $processNumber (1 .. 15) { 
$pm->start and next; 
<subroutine to ssh to the server and perform some actions>; 
$pm->finish; 
} 
$pm->wait_all_children; 

每個進程都有約5000多創造一些表格等 間歇性,它要求輸入密碼時,它通常不驗證客戶端的迭代。

我的ssh密鑰保存在服務器上。

可能是什麼問題?任何幫助表示讚賞。

+0

你使用的是命令行'ssh'還是Perl模塊? –

+0

命令行ssh。 –

+0

不是一個答案(手頭有信息,我不知道),但是你可以用更多的詳細信息啓動'ssh'並將日誌輸出與預期的無密碼連接進行比較。 –

回答

1

當您在遠程服務器的sshd上點擊掛起身份驗證的連接的最大同時連接數時,我通常會看到此行爲。默認值是10,因爲你使用了15個分叉的孩子,所以你可以偶爾達到這個限制。

一些解決方案:在服務器上

  1. 編輯/etc/ssh/sshd_config,增加MaxStartups
  2. 或者,你可以嘗試在你的foreach循環頂部添加sleep $processNumber;,以確保連接是交錯的。
  3. 或者只是將您的過程計數從15減少到10或更低。

無關,但您可能會想要在命令行上使用-O BatchMode=yes來調用ssh,以防止它以交互方式提示您輸入密碼或密鑰確認。它會失敗並以非零值退出,從而使腳本更容易檢測並正常處理錯誤。

相關問題