Linux论坛's Archiver

宝马与通用选择MeeGo作为车机基础系统

root1982 发表于 2010-2-26 00:23

perl NET::Telnet 连接SUSE linux 问题"unknown terminal type"

[i=s] 本帖最后由 root1982 于 2010-2-26 00:41 编辑 [/i]

[code]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;[/code]程序死住不动,最后超时。
telnet.log内容如下:[code]Welcome to SUSE Linux Enterprise Server 10 SP1 (x86_64) - Kernel 2.6.16.46-0.12-default (5).

vm-sles10u5 login: <user>
Password:
Last login: Thu Feb 25 10:41:07 EST 2010 from <mymachine> on pts/5
tset: unknown terminal type network
Terminal type? [/code]大家有什么建议吗?

补充:是从windows 连接linux

root1982 发表于 2010-3-2 00:28

[i=s] 本帖最后由 root1982 于 2010-3-2 04:08 编辑 [/i]

没人理我,我就自己顶自己吧。
我还是没有完全搞明白,但是已经有了一个临时的解决办法。

首先从telnet的log来看,是tset命令出问题了。terminal type 是network,但是系统不认识。
在/etc/profile里边看到下面一行:[code]
test -x /usr/bin/tset && /usr/bin/tset -I -Q
[/code]怀疑是这个出了问题。把这行改成(把network 变成 vt100):[code]
test -x /usr/bin/tset && /usr/bin/tset -I -Q -m network:vt100
[/code]就没问题了。

[color=Red]奇怪的是/usr/share/n/network 是存在的,连接到../n/net。不知道为什么系统还是不认识network.[/color]

root1982 发表于 2010-3-3 04:40

还是自己顶自己!

用option_log可以记录所有的telnet协议的通讯。可以看出perl是不返回terminal info的。我的服务器会默认成network,然后就出问题了。正确的解决方法是在perl端,返回terminal type。代码如下:[code]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;
}
[/code]参考网页:
[url]http://cpansearch.perl.org/src/AJWOOD/Term-VT102-0.80/VT102/examples/telnet-usage.pl[/url]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.