2010-02-25 11 views
5

Tuve un problema al conectarme a una máquina SUSE Linux por el módulo Net::Telnet de Perl. El código se parece a continuación:¿Cómo puedo solucionar el "tipo de terminal desconocido" cuando me conecto con Net :: Telnet de Perl?

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; 

El archivo de registro se parece a continuación: Bienvenido a 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? 

¿Alguna sugerencia?

Respuesta

3

Si usa la función option_log para registrar las opciones de telnet recibidas y devueltas. Verá que Perl no envía el tipo de terminal al servidor por defecto. El servidor establecerá el tipo de terminal en "red" por alguna razón.

La forma correcta de hacerlo es establecer el tipo de terminal en el lado 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; 
} 

Refer to this

1

Consulte this discusión para el mismo problema. La solución (no probado) que proponen es establecer la variable ambiental plazo a un valor conocido, como TERM=vt100

+0

Veo la misma discusión, pero ¿cómo? ¿Debo "exportar TERM = vt100" en mi equipo local o exportarlo en el perfil de la máquina remota para el usuario de telnet? ¡Gracias! – root1982

+0

@ root1982 o diga '$ ENV {TERM} = 'vt100'' en su script de Perl – mob

+0

Gracias a todos. Todavía tengo el mismo problema. – root1982

0

en/etc/profile, debe encontrar la siguiente línea:

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

Este es el línea que causa el problema. Puede confirmar con la ejecución del siguiente comando:

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

en/usr/share/terminfo/n /, la red es un enlace a ../n/net. No sé por qué el sistema no funciona para "red".

solución

La temperatura es cambiar la línea en/etc/perfil a lo siguiente:

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

El comando anterior mapa de la red en VT100.

1

Lo que funciona también es añadir el signo de interrogación a su valor de solicitud y enviarlo como el primer comando el valor $ TERM eco. Entonces, si el símbolo del sistema es '>' y echo $ TERM da '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"; 
Cuestiones relacionadas