20); $t-6ren">
gpt4 book ai didi

perl - 连接 Perl 的 Net::Telnet 时如何修复 "unknown terminal type"?

转载 作者:行者123 更新时间:2023-12-04 19:22:44 38 4
gpt4 key购买 nike

我通过 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, $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

关于perl - 连接 Perl 的 Net::Telnet 时如何修复 "unknown terminal type"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2335531/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com