2015-02-10 2 views
0

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

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

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; 

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

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

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

Вот как выглядит нормальный выход телнет сессии:

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. 

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

+0

Могу ли я предложить не использовать 'Net :: Telnet' - есть много слабых сторон вокруг обычного текстового протокола, такого как telnet, и именно поэтому он отключен по умолчанию на большинстве серверов в наши дни. – Sobrique

+0

Какую библиотеку вы тогда рекомендовали бы использовать вместо этого? – Yarex

+0

Это был скорее вопрос «не использовать telnet». – Sobrique

ответ

0

У меня есть только опыт использования 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);

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

+0

Это просто быстрый код для проверки. Я знаю, что порт по умолчанию для telnets равен 23, но хотел убедиться, что он явно установлен (защитное программирование), которое я использовал waitfor для извлечения данных. Пробовал также cmd, но без особого успеха – Yarex