Perl Net::Telnet 检索单行输出

Posted

技术标签:

【中文标题】Perl Net::Telnet 检索单行输出【英文标题】:Perl Net::Telnet retrieving single line of output 【发布时间】:2021-02-15 05:44:32 【问题描述】:

使用 Perl 的 Net::Telnet 模块从 upsd 检索数据。 我正在尝试实现一个特定的功能,即检索单个 var 的数据。 问题是只输出了一行,并且该行用于匹配 提示,所以不输出。

这里是原始的 telnet:

telnet dns1 3493
Trying 192.168.15.1...
Connected to dns1.
Escape character is '^]'.
get var cp1500 ups.test.result
VAR cp1500 ups.test.result "Done and passed"
Connection closed by foreign host.

这里有一些代码:

#!/usr/bin/perl
use strict;
use warnings;
use Net::Telnet;

my $host = "dns1";
my $model = "cp1500";
my $bvar = "ups.test.result";
my $t = new Net::Telnet (Timeout => 3, Port => 3493, Prompt => "/VAR $model $bvar/");
$t->open($host);
my @ary = $t->cmd("get var $model $bvar");
print @ary,"\n";

这只是在数组为空时打印换行符。提示匹配,否则会出现超时错误。如何获取该单行输出以在脚本中进行处理?

【问题讨论】:

***.com/q/8805369/725418 @TLP 你能解释一下这篇文章有什么帮助吗,谢谢 更一般的建议是用 SSH 代替 Telnet。 Telnet 感觉很陈旧。但也许Net::SSH::Expect 更合适。 也许您需要指定一个Prompt -- 此方法发送命令$string,并读取命令返回的字符,直到匹配提示符为止。假设您要发送到的程序是某种命令提示解释器,例如 shell。 doc。也许你打算print $_ . "\n" for @ary; cmd() 返回回显的命令字符串和提示符之间的所有字符。因此,一旦匹配到"VAR cp1500 ups.test.result",它就会停止读取。然后,您也许可以使用getline() 获得其余的信息。系统缺少真正的命令提示符是真正的问题。最好只使用 print 和 waitfor 或 getline/getlines。 【参考方案1】:

这是我的解决方案,使用 Socket 而不是 Net::Telnet。

#!/usr/bin/perl
use strict;
use warnings;
use Socket;

my $host = 'str003';
my $port = 3493;
my $model = 'cp1350';
my $quer = 'get var';
my $bvar = 'ups.test.result';
my ($sock,$iaddr,$paddr,$send);
$iaddr = inet_aton($host);
$paddr = sockaddr_in($port, $iaddr);
$send = join(' ',$quer,$model,$bvar);
socket($sock, AF_INET, SOCK_STREAM, 6) or die $!;
connect($sock , $paddr) or die "connect failed : $!";
send($sock , "$send\nlogout\n" , 0);
while (my $line = <$sock>)

  if ($line =~ /^VAR/) 
    print "$line\n";
  

close($sock);

这是返回一行数据的地方:

VAR cp1350 ups.test.result "Done and passed"

【讨论】:

以上是关于Perl Net::Telnet 检索单行输出的主要内容,如果未能解决你的问题,请参考以下文章

Perl单行(Perl One-Liners)命令

超时在 perl Net::Telnet 上不起作用

Perl one lines

指定要处理的文件到 Perl 单行

Perl单行命令介绍

最小的 Perl/Gtk2 远程登录客户端