我在使用Perl的
Net::Telnet模块连接到SUSE linux机器时遇到了问题.
代码如下所示:
代码如下所示:
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?
有什么建议?
解决方法
如果使用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,$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",0),$termtype,"\xff\xf0"); $obj->output_record_separator($ors_old); $obj->telnetmode ($otm_old); } 1; }