Ahmed Abuzekry Ahmed Abuzekry - 1 year ago 150
Perl Question

Using telnet with pipe with backticks in perl

I am trying to test a specific server is up and running on a certain port so I am using

$result = `echo exit | telnet 9443`; print $result;

Here I am using localhost for privacy issues
The expected behavior is that it should print "...Could not open connection to the host, on port 9443: Connect failed", this way I know that the server is not running. but it prints an empty string

Any help on this

Answer Source

The failure message is printed to STDERR, while backticks return only what goes to STDOUT.

You can redirect the STDERR stream to the STDOUT stream

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

See I/O redirection.

There are more rounded ways to do this, using various forms of open. See it in perlfaq8. There are also various modules for this. The Capture::Tiny makes it rather easy.

use warnings 'all';
use strict;

use Capture::Tiny qw(capture);

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

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

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

This prints for me

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

The module has many more capabilities. From the docs

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.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download