Я получил проблему, соединяющуюся с машиной Linux SUSE Сетью Perl:: модуль Telnet. Код похож ниже:
my $t = new Net::Telnet (Timeout => 20);
$t->open($server);
$t->input_log("telnet.log");
$t->login($user, $pass);
my @lines=$t->cmd($command);
print @lines;
Файл журнала похож ниже: Добро пожаловать в SUSE Linux Enterprise Server 10 SP1 (x86_64) - Ядро, по умолчанию 0.12 2.6.16.46 (5).
vm-sles10u5 login:
Password:
Last login: Thu Feb 25 10:41:07 EST 2010 from on pts/5
tset: unknown terminal type network
Terminal type?
Какие-либо предложения?
Если вы используете функцию option_log для регистрации полученных и возвращенных опций telnet. Вы увидите, что Perl не посылает тип терминала серверу по умолчанию. По некоторым причинам сервер по умолчанию посылает тип терминала "network".
Правильный способ сделать это - установить тип терминала на стороне perl.
my $termtype = 'vt100'; my $telopt_ttype_ok = '';
my $t = new Net::Telnet (Timeout => 5);
$t->option_callback(\&opt_callback);
$t->option_accept(Do=>Net::Telnet->TELOPT_TTYPE);
$t->suboption_callback(\&subopt_callback);
$t->open($server);
$t->input_log("runRemoteCommand_telnet.log");
$t->login($user, $pass);
$t->cmd($command);
exit 0;
sub opt_callback {
my ($obj, $option, $is_remote, $is_enabled, $was_enabled, $buf_position) = @_;
if ($option == Net::Telnet->TELOPT_TTYPE and $is_enabled and !$is_remote) {
$telopt_ttype_ok = 1;
}
1;
}
sub subopt_callback {
my ($obj, $option, $parameters) = @_;
my ($ors_old, $otm_old);
if ($option == Net::Telnet->TELOPT_TTYPE)
{
$ors_old = $obj->output_record_separator('');
$otm_old = $obj->telnetmode (0);
$obj->print("\xff\xfa", pack("CC", $option, 0), $termtype, "\xff\xf0");
$obj->output_record_separator($ors_old);
$obj->telnetmode ($otm_old);
}
1;
}
См. это обсуждение той же проблемы. Решение (непроверенное), которое они предлагают, заключается в установке переменной окружения TERM в известное значение, например TERM=vt100
В В / etc / profile вы должны найти следующую строку:
test -x /usr/bin/tset && /usr/bin/tset -I -Q
Это строка, которая вызывает проблему. Вы можете подтвердить, выполнив следующую команду:
$>TERM=network
$>/usr/bin/tset -I -Q
tset: unknown terminal type network
Terminal type?
В / usr / share / terminfo / n / сеть - это ссылка на ../n/net. Не знаю, почему система не работает "по сети".
Временное исправление заключается в изменении строки в / etc / profile на следующее:
test -x /usr/bin/tset && /usr/bin/tset -I -Q -m network:vt100
Приведенная выше команда отображает сеть на vt100.