perl net::telnet. метод cmd() возвращает предыдущий вывод консольки

Phoenix

 

#!/usr/bin/perl

use Net::Telnet;

my $t = new Net::Telnet ( Telnetmode => 0,
Binmode => '\015\012',
Timeout => 10,
Port => 5005,
Prompt => '/\[\w+\].*$/');

my $fi = $t->input_log("x.log");
my $fo = $t->output_log("y.log");
my $fd = $t->dump_log("z.log");

$t->open("127.0.0.1");
$t->waitfor('/Username:.*$/');
$t->print("admin");
$t->waitfor('/Password:.*$/');
$t->print("123");



$ok = $t->lastline;
$msg = $t->errmsg;
print "$msg - $ok \n";

@str = $t->cmd("show version");
print "@str";

exit;



хочется, чтобы @str содержала вывод команды show version, однако, она содержит то, что было выведено после ввода пароля и до приглашения.
однако, пока не выполнишь какую-либо команду, получить этот вывод не получается (например getlines вылетает по таймауту.)
подозреваю, что дело с буферизацией, но где имеено косяк, не пойму.

AlexV769

#!/usr/local/bin/perl

use strict;

use Net::SSH::Perl;
my $host = 'myhost';
my %comm_files = ('sh ip slb conns' => 'conns.dat',
'sh ip slb vservers' => 'vservers.dat',
'sh ip slb reals' => 'reals.dat');

foreach my $command (keys(%comm_files{
my $ssh = Net::SSH::Perl->new($host);
$ssh->login('user', 'pass');

my $fname = $host.'-'.$comm_files{$command};
print "Executing $command, put result in ".$fname."...";
my($conns, $stderr, $exit) = $ssh->cmd($command);
print "exit status: $exit\n";

open(FH, ">".$fname);
print FH $conns;
close(FH);
}

Sharp

$t->waitfor('/Password:.*$/');
$t->print("123");
а почему после этого print-а ты не поставил waitfor ? вот у тебя и получается, что cmd отрабатывает, а когда пытается считать буфер, нарывается на $prompt, который остался после твоего логина.

Phoenix

всё. понял
спасибо.
c ssh тоже попробую потом.
Оставить комментарий
Имя или ник:
Комментарий: