在perl中使用带有反引号的管道的telnet

时间:2016-10-17 07:34:44

标签: perl pipe telnet backticks

我正在尝试测试特定服务器已启动并在某个端口上运行,因此我正在使用 $result = `echo exit | telnet 127.0.0.1 9443`; print $result;

我在这里使用localhost来解决隐私问题 预期的行为是它应该打印" ...无法打开与主机的连接,在端口9443上:连接失败",这样我就知道服务器没有运行。但它会打印一个空字符串

对此有任何帮助

1 个答案:

答案 0 :(得分:3)

失败消息打印到STDERR,而反引号仅返回STDOUT

您可以将STDERR信息流重定向到STDOUT信息流

$result = `echo exit | telnet 127.0.0.1 9443 2>&1`; 

请参阅I/O redirection

使用各种形式的open,有更多方法可以做到这一点。见it in perlfaq8。还有各种模块。 Capture::Tiny使它变得相当容易。

use warnings 'all';
use strict;

use Capture::Tiny qw(capture);

my $cmd = 'echo exit | telnet 127.0.0.1 9443';

my ($stdout, $stderr) = capture {
  system ( $cmd );
};

print "STDOUT: $stdout";
print "STDERR: $stderr";

这为我打印

STDOUT: Trying 127.0.0.1...
STDERR: telnet: connect to address 127.0.0.1: Connection refused

该模块具有更多功能。来自文档

  

Capture :: Tiny提供了一种简单,可移植的方式来捕获发送到STDOUT或STDERR的几乎任何内容,无论它是来自Perl,来自XS代码还是来自外部程序。