1

我需要有关 Net: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.

任何帮助表示赞赏

4

1 回答 1

0

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

虽然我对这种类型的终端没有经验,但有几件事很突出。例如TelnetMode => 0,禁止解释 telnet 控制序列。仅当您Net::Telnet用于连接到非 telnet 服务时才应该这样做。

其他让我看不惯的东西:

  • 默认端口是 23,默认 Errmode 是“死”,所以这些有点多余。
  • put函数不返回输出,您需要使用cmd
  • 永远不要使用$aand$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;

我通常在解析@lines...如果您只想打印输出,那么您不需要临时变量,只需print for $conn->cmd("14");

如果系统特别慢,用更长的超时时间初始化连接,即my $conn = new Net::Telnet (Prompt => $prompt, Timeout => 20);

希望这可以帮助。

于 2015-02-11T01:36:52.830 回答