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

Using telnet with pipe with backticks in perl

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

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

对此有任何帮助

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

您可以将 STDERR 流重定向到 STDOUT

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

参见I/O redirection


有更全面的方法可以做到这一点,使用各种形式的open。请参阅 it in perlfaq8. There are also various modules for this. The 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 provides a simple, portable way to capture almost anything sent to STDOUT or STDERR, regardless of whether it comes from Perl, from XS code or from an external program.