Using IPC::Run trying to imitate the following is not producing the desired affect for me at this time. Unfortunately I am not familiar enough with I/) redirection with IPC::Run
to solve for myself and I will need to employ the great knowledge-base of SO.
Command I am imitating
echo | openssl s_client -connect google.com:443 2>/dev/null |openssl x509
This will display the SSL certificate retrieved from a remote server with openssl
. The key to it working right is the 2>/dev/null
pump of stderr
to /dev/null as openssl
will use stderr
to output additional information (not really error) and without this the command being piped into openssl x509
will fail.
Here is where IPC::Run
come in. I need to use this functionality of openssl
in perl using IPC::Run
as that is what all my other functions are using currently. Unfortunately using IPC::Run
in the manner in which I do shell redirects such as 2>/dev/null
do not work as a shell is not evoked, to run the command and adding 2>/dev/null
will simply append that as an argument to the openssl
call.
Currently I have the following, which would work without the pesky stderr
issue. Also there is no agreement to the openssl
command to suppress it.
use IPC::Run qw( run );
my ( $out, $err );
my @cmd = qw(echo);
my @cmd2 = qw(openssl s_client -connect google.com:443:443);
my @cmd3 = qw(openssl x509);
run \@cmd, "|", \@cmd2, "|", \@cmd3, \$out, \$err;
if ( $err ne '' ) {
print $err;
}
else {
print "$out\n";
}
So basically I need to discard stderr
for @cmd2 which is typically done with,
run \@cmd, \$in, \$out, \undef;
but with the | present as stdin
for @cmd3 I can not redirect stderr
from @cmd2 as the descriptors for stderr
is after that for stdout
. I figure there has to be a way to suppress 'stderr' using this module between two pipe, but I have not figured it out yet, and am not familiar with the I/O operations enough to get this quickly. Anyone got a suggestion for doing this from experience?