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

时间:2015-02-10 18:35:16

标签: perl terminal telnet suse vt100

我需要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.

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

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

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

向我看的其他东西:

  • 默认端口为23,默认的Errmode为' 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;

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

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

希望这有帮助。