首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl Net::Telnet检索单行输出

Perl Net::Telnet检索单行输出
EN

Stack Overflow用户
提问于 2020-11-02 22:46:24
回答 1查看 94关注 0票数 1

使用Perl的Net::Telnet模块从upsd检索数据。我正在尝试实现一个特定的功能,即检索单个变量的数据。问题是只输出了一行,而该行用于匹配提示符,因此不会输出。

这是原始的telnet:

代码语言:javascript
复制
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.

下面是一些代码:

代码语言:javascript
复制
#!/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";

这只会在数组为空时打印换行符。提示匹配,否则会出现超时错误。如何才能将这一行输出恢复到脚本中进行处理呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-03 08:28:39

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

代码语言:javascript
复制
#!/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);

这是返回一行数据的代码:

代码语言:javascript
复制
VAR cp1350 ups.test.result "Done and passed"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64647738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档