Проблема Perl с linux @ Net:: Telnet и терминалом vt-100

Мне нужна помощь с Net:Telnet. Пытаюсь подключиться к терминалу VT-100. При использовании обычного телнета из консоли все работает нормально. Я могу подключаться и выдавать команды, но когда я пытаюсь сделать то же самое из Perl, он подключается, но затем ничего не происходит - у меня нет вывода или ожидания просто тайм-ауты или отображается, что подсказка не соответствует (но это так, потому что это всегда три буквы и > знак). Я пробовал все возможные способы -> используя такие методы, как print, cmd, put, но безуспешно и застрял на этом на 2 дня.

Вот мой пример кода:

use Net::Telnet ();
my $conn = new Net::Telnet (TelnetMode => 0);

unless ($conn->open(Host => $host, Port => 23))
{
    die "Error opening socket:: ".$conn->errmsg();
}

print "Connected to ".$conn->host().", port ".$conn->port()."\n";

$conn->prompt('/...>/'); # prompt is 014>

my $lines = $conn->put("15\r"); # command 15 to give me the site name
my ($a,$b);
($a,$b) = $conn->waitfor(Match=>'/...>/',Timeout=>100);

$conn->close;

Когда введена неправильная команда, обычно telnet отображает сообщение об ошибке и подсказку, но Perl ничего не делает. Журнал ввода пуст, журнал вывода пуст, а журнал дампа содержит только следующее:

0x00000: 31 35 0d 0a 15..

Я не знаю, что еще попробовать.

Вот как выглядит обычный вывод сеанса telnet:

Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.

014>15
15
014 TMR Name

014>^]
telnet> quit
Connection closed.

Любая помощь приветствуется


person Yarex    schedule 10.02.2015    source источник
comment
Могу ли я предложить не использовать Net::Telnet - в протоколе с открытым текстом, таком как telnet, есть много недостатков, и поэтому в наши дни он отключен по умолчанию на большинстве серверов.   -  person Sobrique    schedule 10.02.2015
comment
Какую библиотеку вы бы порекомендовали использовать вместо этого?   -  person Yarex    schedule 12.02.2015
comment
Это был скорее вопрос о том, чтобы не использовать telnet.   -  person Sobrique    schedule 12.02.2015


Ответы (1)


У меня есть опыт использования Net::Telnet только для подключения к маршрутизаторам и коммутаторам, и у меня никогда не было проблем.

Хотя у меня нет опыта работы с терминалом такого типа, есть несколько вещей, которые выделяются. Например, TelnetMode => 0 отключает интерпретацию управляющих последовательностей telnet. Это следует делать только в том случае, если вы используете Net::Telnet для подключения к службе, отличной от telnet.

Другие вещи, которые смотрят на меня:

  • Порт по умолчанию — 23, а Errmode по умолчанию — «умереть», поэтому они избыточны.
  • Функция put не возвращает вывод, вам нужно использовать cmd
  • Никогда не используйте $a и $b, так как это специальные переменные, используемые Perl для сортировки.

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

use strict;
use warnings;
use Net::Telnet;

my $prompt = '/.+[:#>] *$/';
my $conn = new Net::Telnet (Prompt => $prompt);

$conn->open($host); # WILL DIE IF CONNECTION FAILS

# AUTHENTICATION GOES HERE IF NEEDED
# $conn->login($username, $password);

print "Connected to ".$conn->host().":".$conn->port()."\n";

my @lines = $conn->cmd("14");
print for @lines;

$conn->close;

Я обычно разбираю @lines... Если вы просто хотите распечатать вывод, вам не нужна промежуточная переменная, и вы можете просто print for $conn->cmd("14");

Если система работает особенно медленно, инициализируйте соединение с более длительным тайм-аутом, т.е. my $conn = new Net::Telnet (Prompt => $prompt, Timeout => 20);

Надеюсь это поможет.

person Joshua    schedule 11.02.2015
comment
Это просто быстрый код для проверки вещей. Я знаю, что порт telnet по умолчанию - 23, но хотел убедиться, что он явно установлен (защитное программирование). Я использовал waitfor для получения данных. Пробовал cmd тоже, но без особого успеха - person Yarex; 11.02.2015