Отправить команду на несколько устройств - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть этот скрипт для чтения списка устройств и отправки команды.но в настоящее время он читает только первое устройство и отправляет ему команду, игнорируя остальные.Что я пропустил?

#!\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 $@ \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();
}

Ответы [ 3 ]

7 голосов
/ 14 декабря 2011

Вы не должны закрывать свой List дескриптор файла внутри цикла while.Переместите строку close (List); на после закрывающей скобки:

open(List, '<', "$host") or die "$!";
while(<List>) {
    # ⋮
}
close (List);
4 голосов
/ 14 декабря 2011

Вы закрываете дескриптор файла внутри цикла while().Переместите close(List) так, чтобы оно находилось за пределами while():

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

Редактировать : Я только что заметил, что вы также делаете это в цикле while():

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

Это приведет к тому, что ваш выходной файл будет перезаписываться каждый раз в цикле, поэтому в нем будут только результаты последней команды.Вы можете переместить open() / close() вне цикла или открыть файл в режиме добавления:

open OUTPUT, '>>', $result;

Вы также не проверяете, успешно ли open();Вы должны поставить or die $! в конце вашего open() заявления.

4 голосов
/ 14 декабря 2011
close(List);

должно быть после закрывающей скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...