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 检索单行输出的主要内容,如果未能解决你的问题,请参考以下文章