7

我通过 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) - 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? 

有什么建议么?

4

4 回答 4

4

如果使用 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;
}

参考这个

于 2010-03-02T20:34:40.013 回答
1

有关相同问题,请参见此讨论。他们提出的解决方案(未经测试)是将 TERM 环境变量设置为已知值,例如TERM=vt100

于 2010-02-25T16:47:40.487 回答
1

也可以在提示值中添加问号,然后将 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";
于 2011-10-19T15:49:54.017 回答
0

在 /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/ 中,network 是指向 ../n/net 的链接。我不知道为什么系统不适用于“网络”。

临时修复是将 /etc/profile 中的行更改为以下内容:

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

上面的命令会将网络映射到 vt100。

于 2010-03-01T16:42:01.417 回答