2016-10-17 61 views
1

我想测试特定服务器正常某个端口上运行,所以我使用 $result = `echo exit | telnet 127.0.0.1 9443`; print $result;使用带管的telnet在perl的反引号

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

这个

回答

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代码还是来自外部程序。

+0

它仍然打印一个空字符串我试过了。当我尝试像'which java'这样的其他命令时,它会正确输出输出,但是在telnet命令中它不会输入 –

+0

@AhmedAbuzekry这看起来很奇怪。我试了一下,然后我收回消息。 – zdim

+0

我不知道我以前试过,它不工作 –