Привет.
Подскажите пожалуйста, как мне с помощью Net::Telnet организовать интерактивный telnet shell, такой как при использовании простого telnet.
У меня задача такая, чтобы при нажатии клавиши она сразу посылалась хосту, а не ждала нажатия Enter и при этом чтобы всё, что отдает мне хост сразу появлялось у меня на STDOUT. Допустим для Cisco если я жму ? то cisco отдает мне список доступных команд.
Как это реализовать с помощью net::telnetЗарание очень благодарен,
Дмитрий Леоненко.
>Привет.
>Подскажите пожалуйста, как мне с помощью Net::Telnet организовать интерактивный telnet shell, такой
>как при использовании простого telnet.
>У меня задача такая, чтобы при нажатии клавиши она сразу посылалась хосту,
>а не ждала нажатия Enter и при этом чтобы всё, что
>отдает мне хост сразу появлялось у меня на STDOUT. Допустим для
>Cisco если я жму ? то cisco отдает мне список доступных
>команд.
>Как это реализовать с помощью net::telnet
>
>Зарание очень благодарен,
>Дмитрий Леоненко.
Для перехвата одного нажатия клавиши (как в Cisco :), используйте модуль Term::ReadKey.
Я бы, наверное, использовал IO::Socket, не забыв сделать $socket->autoflush(1);Или (если нужна работа с Cisco) внимательно посмотрел бы на Net::Telnet::Cisco
Вот мой код, написанный с использованием Net::Telnet
Проблема тут только в одном - после первого нажатия Enter мне на экран не появляется строка, а просто остается пустота, а при следующих нажатиях любых клавиш идет отставание на 1 символ в выводе....
Странно то, что я смотрю tail -f /tmp/out.log и tail -f /tmp/inp.log и там всё идет вовремя за исключением злополучного Enter'а
#!/usr/local/bin/perl -w
sub printhelp {
print "============= HELP ==============\n";
print "To connect to host type\n:<hostname>\n";
print "with <hostname> changed to cisco hostname or IP address\n\n";
print "To see help type help\n";
}
sub get_login {
print "Username:";my chomp($username=<STDIN>);
print "Password:";my chomp($password=<STDIN>);
}
use Term::ReadKey;
use Net::Telnet;
use Net::Ping;
start:
#$p = Net::Ping->new();
while (not defined($cmd)){
print "CIPE>";$input=<STDIN>;
if ($input =~ /\:(.*)\n/) {$cmd=$1;}
else {&printhelp;goto start;}
# if ($p->ping($cmd)){
print "Connecting to $cmd\n";
$conn = new Net::Telnet (Timeout => 5,
Dump_log=>"/tmp/dul2.log",
input_log=>"/tmp/out.log",
output_log=>"/tmp/inp.log",
binmode=>1
);
if (not defined($password)){&get_login;}
$conn->open(host => $cmd);
$conn->waitfor('/Username.*$/');
$conn->print($username);
print ($conn->get);
$conn->waitfor('/Password.*$/');
$conn->print($password);
print ($conn->get);
while($conn){
Readmode 4;
while(not(ReadKey(-1))){
if (defined($key)){
$conn->put($key);
print ($conn->get);
undef(key);
}
}
}
}