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?
有什么建议吗?
答案 0 :(得分:3)
如果使用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;
}
答案 1 :(得分:1)
有关同一问题,请参阅this讨论。他们建议的解决方案(未经测试)是将TERM环境变量设置为已知值,例如TERM=vt100
答案 2 :(得分:1)
还有一个问题是将问号添加到提示值,然后作为第一个命令发送echo $ TERM值。因此,如果您的命令提示符为'&gt;'和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";
答案 3 :(得分: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。