2011-12-14 13 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

これは最初の問題を解決しました。 2番目のデバイスリストを読み取っていたが、2番目のデバイスに接続できなくなりました。 "ホストに接続できません"というエラーが表示される – Daniel

7

whileループ内のファイルハンドルListを閉じないでください。 close (List);行を閉じ括弧の後に移動してください。

+0

おかげで、私の主な問題が解決しました。 – Daniel

関連する問題