Отображение части конфигурации (--More)

Я сделал свой скрипт, который подключается к моему коммутатору, но проблема в том, что при просмотре он говорит только часть, остальное отображается как размер (--More). Как я могу сделать, чтобы просмотреть все настройки и спасибо

use Net::OpenSSH;
use warnings;
use Expect;

my $password = 'admin';
my $enable = '';
my $ip = '192.16.25.39';
my $username='user';
my $ssh = Net::OpenSSH->new("$username:$password\@$ip", timeout => 200) ;
$ssh->error and die "unable to connect to remote host: ". $ssh->error;

my $output = $ssh->capture({stdin_data => "enable\n"."admin%\n"."show vlan"."\n"});

if ($output) {print $output . ' ';}

my $line;
print "\n";

# closes the ssh connection
$ssh->close();

Я пробовал это с модулем Expect:

use Net::OpenSSH;
if ($output) {
    print $output . ' ';
    my $expect = Expect->init($output);
    $expect->raw_pty(1);
    #$expect->debug(2);
    my $debug and $expect->log_stdout(1);
    while(<$pty>) {
        print "$. $_ "
    }
}

который выдает эту ошибку:

Невозможно благословить нереференсное значение в /usr/local/share/perl5/Expect.pm, строка 202 (#1) (F) Благословить можно только жесткие ссылки. Вот как Perl «обеспечивает» инкапсуляцию объектов. См. перлобж. Неперехваченное исключение из пользовательского кода: невозможно благословить нереференсное значение в /usr/local/share/perl5/Expect.pm, строка 202. в /usr/local/share/perl5/Expect.pm, строка 202. Expect::exp_init ("Ожидайте", "\x{d}\x{a}witch>включить\x{d}\x{a}пароль:\x{d}\x{a}switch#show vlan\x{d} \x{a}\x{d}\x{a}VLA"...) вызывается в строке 19 b.pl "


person ahmed    schedule 10.03.2015    source источник
comment
Вывод --More-- звучит так, как будто он создается самим коммутатором в ответ на команду show vlan. Я хотел бы посмотреть, сможете ли вы выполнить команду таким образом, чтобы коммутатор не ждал ввода с клавиатуры перед возвратом. Если это невозможно сделать, используйте Может быть полезен модуль ожидания с Net::OpenSSH.   -  person Tim Pierce    schedule 10.03.2015
comment
Я использовал Expect, но столкнулся с проблемой :(   -  person ahmed    schedule 10.03.2015
comment
когда я использую Expect , у меня появляется это сообщение, например, вывод не может благословить нереференсное значение в /usr/local/share/perl5/expect .pl, строка 202, какое-нибудь решение, пожалуйста?   -  person ahmed    schedule 10.03.2015
comment
я пробую это с ожидаемым: используйте Net::OpenSSH; если ($ вывод) { распечатать $ вывод. ' '; мой $expect = Expect-›init($output); $expect-›raw_pty(1); #$ожидание-›отладка(2); мой $debug и $expect-›log_stdout(1); в то время как (‹$pty›) { печать $. $_ }}   -  person ahmed    schedule 10.03.2015
comment
в этом проблема. Не удается благословить значение, не являющееся ссылкой, в /usr/local/share/perl5/Expect.pm, строка 202 (#1) (F) Могут быть благословлены только жесткие ссылки. Именно так Perl обеспечивает инкапсуляцию объектов. См. перлобж. Неперехваченное исключение из пользовательского кода: невозможно благословить нереференсное значение в /usr/local/share/perl5/Expect.pm, строка 202. в /usr/local/share/perl5/Expect.pm, строка 202. Expect::exp_init (Ожидайте, \x{d}\x{a}witch›enable\x{d}\x{a}пароль:\x{d}\x{a}switch#show vlan\x{d}\x{ a}\x{d}\x{a}VLA...) вызывается в строке 19 b.pl   -  person ahmed    schedule 10.03.2015
comment
я нахожу это :) :) без ожидания :)   -  person ahmed    schedule 10.03.2015


Ответы (1)


Это может быть лучшим подходом к вашей проблеме. Существует модуль Net::Telnet::Cisco, который упрощает многие взаимодействие с удаленным маршрутизатором. По-видимому, вы можете сначала установить зашифрованное SSH-соединение с Net::OpenSSH, а затем использовать дескриптор файла из этого соединения для запуска сеанса Net::Telnet::Cisco.

Поэтому я думаю, что что-то вроде этого было бы более перспективным, чем попытка использовать Net::OpenSSH напрямую:

use Net::OpenSSH;
use Net::Telnet::Cisco;

my $password = 'admin';
my $enable = '';
my $ip = '192.16.25.39';
my $username='user';
my $ssh = Net::OpenSSH->new("$username:$password\@$ip", timeout => 200) ;
my ($pty, $pid) = $ssh->open2pty({stderr_to_stdout => 1})
  or die "unable to start remote shell: " . $ssh->error;
my $cisco = Net::Telnet::Cisco->new(
              -fhopen => $pty,
              -telnetmode => 0,
              -cmd_remove_mode => 1,
              -output_record_separator => "\r");
my @vlan = $cisco->cmd("show vlan");

Я не знаком со всеми тонкостями настройки маршрутизаторов Cisco, поэтому вам придется начать с этого, но мне кажется, что это гораздо более простой способ получить то, что вам нужно.

person Tim Pierce    schedule 10.03.2015