Как я могу исправить «неизвестный тип терминала» при соединении с Perl Net :: Telnet? - PullRequest
5 голосов
/ 25 февраля 2010

У меня проблема с подключением к машине SUSE linux с помощью модуля Perl Net :: 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) - ядро ​​2.6.16.46-0.12-default (5).

vm-sles10u5 login: <myuser>
Password: 
Last login: Thu Feb 25 10:41:07 EST 2010 from <mymachine> on pts/5
tset: unknown terminal type network
Terminal type? 

Есть предложения?

Ответы [ 4 ]

3 голосов
/ 02 марта 2010

Если вы используете функцию option_log для регистрации полученных и возвращенных опций telnet.Вы увидите, что Perl по умолчанию не отправляет тип терминала на сервер.Сервер будет по умолчанию тип терминала для «сети» по некоторым причинам.

Правильный способ сделать это - установить тип терминала на стороне 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;
}

См. Это

1 голос
/ 19 октября 2011

Что также работает, так это добавление знака вопроса к значению приглашения, а затем отправка в качестве первой команды значения echo $ TERM. Так что если ваша командная строка '>' и echo $ TERM выдает 'xterm':

my $t = new Net::Telnet (   Timeout => 3,
                            Prompt => '/[\?>]/',
                            Dump_log => $dumplog,
                            Host => $host,
                            Input_log => $inputlog,
                            Output_log => $outputlog,
                    );

$t->login($username, $password);
my @lines = $t->cmd("xterm");
@lines = $t->cmd("who");
print @lines, "\n";
@lines = $t->cmd("uptime");
print @lines, "\n";
1 голос
/ 25 февраля 2010

См. это обсуждение той же проблемы. Решение (непроверенное), которое они предлагают, состоит в том, чтобы установить для переменной среды TERM известное значение, такое как TERM=vt100

0 голосов
/ 01 марта 2010

В / 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.

...