2010-02-25 9 views
5

Ho riscontrato un problema durante il collegamento a una macchina Linux SUSE tramite il modulo Net::Telnet di Perl. Il codice si presenta come di seguito:Come posso risolvere "tipo di terminale sconosciuto" durante la connessione con Perl's 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; 

Il file di registro si presenta come di seguito: Benvenuti 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? 

Qualche suggerimento?

risposta

3

Se si utilizza la funzione option_log per registrare le opzioni telnet ricevute e restituite. Vedrete che Perl non invia il tipo di terminale al server per impostazione predefinita. Il server imposterà il tipo di terminale su "rete" per alcuni motivi.

Il modo corretto per eseguire questa operazione è impostare il tipo di terminale sul lato 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

Vedere la discussione this per lo stesso problema. La soluzione (non testata) che si propongono è quello di impostare la variabile ambientale termine ad un valore noto, come ad esempio TERM=vt100

+0

Vedo la stessa discussione, ma come? Devo "esportare TERM = vt100" sul mio computer locale o esportarlo nel .profile del computer remoto per l'utente telnet? Grazie! – root1982

+0

@ root1982 o dì "$ ENV {TERM} =" vt100 "nel tuo script Perl – mob

+0

Grazie a tutti. Ho ancora lo stesso problema. – root1982

0

in/etc/profile, si dovrebbe trovare la seguente riga:

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

Questa è la linea che ha causato il problema. È possibile confermare con il seguente comando:

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

in/usr/share/terminfo/n /, la rete è un collegamento a ../n/net. Non so perché il sistema non funzioni per "rete".

La temperatura correzione è quello di cambiare la linea in/etc/profile al seguente:

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

Il comando precedente mappa di rete per VT100.

1

Ciò che funziona troppo è quello di aggiungere il punto interrogativo al valore di prompt e quindi inviare come primo comando il valore di $ TERM eco. Quindi se il prompt dei comandi è '>' echo $ TERM restituisce '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"; 
Problemi correlati