linux@Net::Telnet和vt-100终端的Perl问题

linux@Net::Telnet和vt-100终端的Perl问题,perl,terminal,telnet,suse,vt100,Perl,Terminal,Telnet,Suse,Vt100,我需要网络方面的帮助:Telnet。正在尝试连接到VT-100终端。当从控制台使用普通telnet时,它工作正常。我可以连接并发出命令,但当我尝试从perl执行相同的操作时,它会连接,但什么也没有发生-我没有输出,或者等待超时,或者显示提示不匹配,但它是正确的,因为它总是三个字母和>号。 我已经尝试了所有可能的方法->使用诸如print、cmd、put之类的方法,但没有任何成功,在这件事上坚持了2天 以下是我的示例代码: use Net::Telnet (); my $conn = new Ne

我需要网络方面的帮助:Telnet。正在尝试连接到VT-100终端。当从控制台使用普通telnet时,它工作正常。我可以连接并发出命令,但当我尝试从perl执行相同的操作时,它会连接,但什么也没有发生-我没有输出,或者等待超时,或者显示提示不匹配,但它是正确的,因为它总是三个字母和>号。 我已经尝试了所有可能的方法->使用诸如print、cmd、put之类的方法,但没有任何成功,在这件事上坚持了2天

以下是我的示例代码:

use Net::Telnet ();
my $conn = new Net::Telnet (TelnetMode => 0);

unless ($conn->open(Host => $host, Port => 23))
{
    die "Error opening socket:: ".$conn->errmsg();
}

print "Connected to ".$conn->host().", port ".$conn->port()."\n";

$conn->prompt('/...>/'); # prompt is 014>

my $lines = $conn->put("15\r"); # command 15 to give me the site name
my ($a,$b);
($a,$b) = $conn->waitfor(Match=>'/...>/',Timeout=>100);

$conn->close;
当输入错误的命令时,telnet通常会显示错误消息和提示,但在Perl中它什么也不做。 输入日志为空,输出日志为空,转储日志仅包含以下内容:

0x00000:31 35 0d 0a 15

我不知道还能尝试什么

以下是正常telnet会话输出的外观:

Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.

014>15
15
014 TMR Name

014>^]
telnet> quit
Connection closed.

非常感谢您的帮助

我只有使用Net::Telnet连接路由器和交换机的经验,而且从未遇到过问题

虽然我对这种类型的终端没有经验,但有几件事很突出。例如,TelnetMode=>0禁止对telnet控制序列进行解释。只有在使用Net::Telnet连接到非Telnet服务时,才应执行此操作

其他让我印象深刻的东西:

默认端口是23,默认错误模式是'die',因此这些是冗余的。 put函数不返回输出,您需要使用cmd 永远不要使用$a和$b,因为它们是perl用于排序的特殊变量。 这可能不管用,但如果我用对我来说很好的习惯用法重新编写你的脚本,我会这样写

use strict;
use warnings;
use Net::Telnet;

my $prompt = '/.+[:#>] *$/';
my $conn = new Net::Telnet (Prompt => $prompt);

$conn->open($host); # WILL DIE IF CONNECTION FAILS

# AUTHENTICATION GOES HERE IF NEEDED
# $conn->login($username, $password);

print "Connected to ".$conn->host().":".$conn->port()."\n";

my @lines = $conn->cmd("14");
print for @lines;

$conn->close;
我通常在分析@行。。。如果只想打印输出,则不需要临时变量,只需打印$conn->cmd14

如果系统速度特别慢,请使用更长的超时来初始化连接,即my$conn=new Net::Telnet Prompt=>$Prompt,timeout=>20


希望这有帮助。

我能建议不要使用Net::Telnet吗?像Telnet这样的纯文本协议有很多缺点,这就是为什么现在大多数服务器默认禁用它的原因。然后你会建议使用什么库来代替它?更重要的是不要使用Telnet。这只是测试东西的快速代码。我知道Telnet的默认端口是23,但我想确保它显式地设置了防御性编程,我使用waitfor来检索数据。我也试过了,但没有多大成功