7 votes

Comment puis-je corriger le message "unknown terminal type" lors de la connexion avec Net::Telnet de Perl ?

J'ai eu un problème de connexion à une machine SUSE linux par Perl Net::Telnet module. Le code ressemble à ce qui suit :

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;

Le fichier journal ressemble à ce qui suit : Bienvenue à SUSE Linux Enterprise Server 10 SP1 (x86_64) - Kernel 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? 

Des suggestions ?

4voto

paul bruno Points 271

Si vous utilisez la fonction option_log pour enregistrer les options telnet reçues et renvoyées. Vous verrez que Perl n'envoie pas le type de terminal au serveur par défaut. Le serveur enverra par défaut le type de terminal à "network" pour certaines raisons.

La bonne façon de procéder est de définir le type de terminal du côté de 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;
}

Reportez-vous à ce qui suit

1voto

Leon Timmermans Points 23230

Ver ce discussion pour le même problème. La solution (non testée) qu'ils proposent est de définir la variable environnementale TERM à une valeur connue, comme par exemple TERM=vt100

1voto

jira850 Points 11

Ce qui fonctionne aussi, c'est d'ajouter le point d'interrogation à votre valeur d'invite, puis d'envoyer comme première commande la valeur echo $TERM. Ainsi, si votre invite de commande est '>' et que echo $TERM donne '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";

0voto

paul bruno Points 271

Dans /etc/profile, vous devriez trouver la ligne suivante :

test -x /usr/bin/tset && /usr/bin/tset -I -Q

C'est la ligne qui cause le problème. Vous pouvez confirmer en exécutant la commande suivante :

$>TERM=network
$>/usr/bin/tset -I -Q
tset: unknown terminal type network
Terminal type? 

Dans /usr/share/terminfo/n/, network est un lien vers ../n/net. Je ne sais pas pourquoi le système ne fonctionne pas pour "network".

La solution temporaire est de changer la ligne dans /etc/profile par la suivante :

test -x /usr/bin/tset && /usr/bin/tset -I -Q -m network:vt100

La commande ci-dessus va mapper le réseau à vt100.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X