URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4188
[ Назад ]

Исходное сообщение
"Perl Net::Telnet Stream"

Отправлено melco , 17-Апр-05 22:18 
Привет.
Подскажите пожалуйста, как мне с помощью Net::Telnet организовать интерактивный telnet shell, такой как при использовании простого telnet.
У меня задача такая, чтобы при нажатии клавиши она сразу посылалась хосту, а не ждала нажатия Enter и при этом чтобы всё, что отдает мне хост сразу появлялось у меня на STDOUT. Допустим для Cisco если я жму ? то cisco отдает мне список доступных команд.
Как это реализовать с помощью net::telnet

Зарание очень благодарен,
Дмитрий Леоненко.


Содержание

Сообщения в этом обсуждении
"Perl Net::Telnet Stream"
Отправлено PoizOn , 18-Апр-05 10:23 
>Привет.
>Подскажите пожалуйста, как мне с помощью Net::Telnet организовать интерактивный telnet shell, такой
>как при использовании простого telnet.
>У меня задача такая, чтобы при нажатии клавиши она сразу посылалась хосту,
>а не ждала нажатия Enter и при этом чтобы всё, что
>отдает мне хост сразу появлялось у меня на STDOUT. Допустим для
>Cisco если я жму ? то cisco отдает мне список доступных
>команд.
>Как это реализовать с помощью net::telnet
>
>Зарание очень благодарен,
>Дмитрий Леоненко.
Для перехвата одного нажатия клавиши (как в Cisco :), используйте модуль Term::ReadKey.



"Perl Net::Telnet Stream"
Отправлено madskull , 18-Апр-05 11:57 
Я бы, наверное, использовал IO::Socket, не забыв сделать $socket->autoflush(1);

Или (если нужна работа с Cisco) внимательно посмотрел бы на Net::Telnet::Cisco


"Perl Net::Telnet Stream"
Отправлено melco , 18-Апр-05 12:37 
Вот мой код, написанный с использованием 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);
                            }
                                }
                    }
                        }