2017-07-06 133 views
1

這是我第一次使用Net :: OpenSSH,並且我正在嘗試創建一個SSH for循環,在那裏我打印服務器的主機名在使用whoami。我強麥在命令行SSH連接到我的意圖的服務器,但是當我運行我的腳本,我遇到以下錯誤......無法使用Net :: OpenSSH進行SSH,可以通過命令行

SSH:無法解析主機名
:名稱或服務不知道
用戶名

爲了獲得更多的信息,我打印的$ssh->error,其中$ssh是我的Net :: OpenSSH的對象的輸出。

無法建立主SSH連接:密碼錯誤或主進程在24行,$ FH線1

這是腳本到目前爲止意外退出...

#!/usr/bin/perl 

use strict; 
use warnings; 
use Net::OpenSSH; 
my $file = 'servers.txt'; 
open (my $fh, $file) or die "Could not open"; 

while (my $row = <$fh>) { 
    my $user = "username"; 
    my $password = "password"; 
    my $ssh = Net::OpenSSH->new(host => $row, user => $user, password => $password); 
    $ssh-error and die "SSH connection failed: " . $ssh->error; 
    my $whoami = `whoami`; 
    print $whoami; 
} 

servers.txt文件是一個包含服務器主機名列表的純文本文件。

我的理解是,如果我可以從命令行對這些服務器進行SSH連接,問題必須出現在腳本中,而不是服務器/網絡。任何洞察爲什麼我Net :: OpenSSH無法解決看似可訪問的服務器,將不勝感激。

+5

你需要在'$ row'上調用'chomp'嗎? – mob

+2

這段代碼甚至不應該編譯(裸字「錯誤」)。 – melpomene

+0

「*姓名或服務不知道*」和​​「*錯誤的密碼或moster過程已退出*」... *嘆息* –

回答

2

「問題必須出現在腳本中」是的,我執行的腳本存在兩個問題。第一個是語法錯誤。其他評論者已經注意到了這一點。

$ssh-error and die "SSH connection failed: " . $ssh->error; 

應該

$ssh->error and die "SSH connection failed: " . $ssh->error; 

另一個問題,這是從版本,您還沒有表現出劇本的到來,這也得到了其他人注意到是否你沒有從$ row中刪除尾隨的換行符。你這樣做與

chomp($row) 

這樣做作爲while塊的開放指令,你應該很好去。

我不得不強調在發佈MCV時格外小心的重要性。在按下提交按鈕之前,請將帖子中的代碼複製到臨時文件並執行,並且您將減少響應者的投訴。

順便說一句,可能有讓你解決你自己的問題的好習慣調試正在執行的Net :: OpenSSH->新

print STDERR ";$row;\n" if $debugging; # or something to this effect 

如果你做了這之前已經加入這一行,你會看到像這樣的STDERR

;myhost 
; 

此外,您使用的模塊在其莢提到一個體面的調試功能。調試輸出不易解釋,但如果您不知道問題出在哪裏,那麼您可能會從那裏開始。如果你已經加入這一行

$Net::OpenSSH::debug = 8; 

然後你會看到這對STDERR

$ cat servers.txt 
localhostx 
$ perl x.pl 
... 
ssh: Could not resolve hostname localhostx 
: nodename nor servname provided, or not known 

這將是這個樣子的,如果你曾經被稱爲格格,但主機名真正不存在

ssh: Could not resolve hostname localhostx: nodename nor servname provided, or not known 
+0

感謝@ jeff6times7,使用chomp工作。我也測試了您的調試建議,並能夠更好地瞭解我的問題。張貼,我意識到我應該在提交我的問題之前更加小心。 –