2011-12-14 92 views
0

我有這個腳本來讀取設備列表併發送命令。但目前它只讀取第一個設備併發送命令,忽略其餘部分。我錯過了什麼?在多個設備上發送命令

#!\usr\bin\Perl\bin\perl 
use warnings; 
use strict; 
use NET::SSH2; 
use MIME::Base64; 
my $host = "C:/temp/devices.txt"; # input file 
my $user = "XXX"; # your account 
my $pass = "XXXXXX"; # your password 64 bit mime 
my $ssh2 = Net::SSH2->new(); 
my $result = "C:/temp/result.txt"; # output file 
$ssh2->debug(1); # debug on/off 
open(List, '<', "$host") or die "$!"; 
while(<List>) { 
    chomp $_; 
    $ssh2->connect("$_") or die "Unable to connect host [email protected] \n"; 
    my $dp=decode_base64("$pass"); 
    $ssh2->auth_password("$user","$dp"); 
    my $chan = $ssh2->channel(); 
    $chan->exec('sh run'); 
    my $buflen =100000; 
    my $buf = '0' x $buflen; 
    my $read = $chan->read($buf, $buflen); 
    warn 'More than ', $buflen, ' characters in listing' if $read >= $buflen; 
    open OUTPUT, ">", "$result"; 
    print OUTPUT "HOST: $_\n\n"; 
    print OUTPUT "$buf\n"; 
    print OUTPUT "\n\n\n"; 
    print OUTPUT 
    close (List); 
    $chan->close(); 
} 

回答

4
close(List); 

應該是右括號之後。

4

您正在關閉while()循環內的文件句柄。移動close(List)所以它的while()之外:

while(<List>) { 
    ... 
} 
close(List); 

編輯:我只注意到你也這樣做,你的while()循環中:

open OUTPUT, ">", "$result"; 

這將導致你的輸出文件是每次都通過循環覆蓋,所以它只有最後一個命令的結果。您既可以移動open()/close()外循環,或追加方式打開文件:

open OUTPUT, '>>', $result; 

你還沒有檢查,看是否open()成功;您應該在open()聲明的末尾放置or die $!

+0

謝謝,這解決了第一個問題。讀取第二個設備列表,但現在無法連接到第二個設備出現錯誤「無法連接到主機」 – Daniel 2011-12-14 19:17:06

7

您不應該在您的while循環內關閉List文件句柄。將close (List);一行移動到大括號後:

open(List, '<', "$host") or die "$!"; 
while(<List>) { 
    # ⋮ 
} 
close (List); 
+0

謝謝,這解決了我的主要問題,現在我的腳本無法連接到列表中的第二個和其餘設備 – Daniel 2011-12-14 19:22:52