我需要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.
感谢任何帮助
答案 0 :(得分:0)
我只有使用Net::Telnet
连接到路由器和交换机的经验,并且从未遇到过问题。
虽然我对这种类型的终端没有经验,但有些事情很突出。例如,TelnetMode => 0
禁止解释telnet控制序列。只有在您使用Net::Telnet
连接到非telnet服务时才能执行此操作。
向我看的其他东西:
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;
我通常正在解析@lines
...如果您只想打印输出,那么您不需要临时变量,只需print for $conn->cmd("14");
如果系统特别慢,请使用较长的超时初始化连接,即my $conn = new Net::Telnet (Prompt => $prompt, Timeout => 20);
希望这有帮助。