使用IPC::Run目前,尝试模仿以下内容并不能产生我想要的效果。不幸的是我对 I/) 重定向不够熟悉 IPC::Run
为了自己解决问题,我需要利用 SO 的丰富知识库。
我正在模仿的命令
echo | openssl s_client -connect google.com:443 2>/dev/null |openssl x509
这将显示从远程服务器检索到的 SSL 证书 openssl
。其正常工作的关键是 2>/dev/null
stderr
的泵到/dev/null 为 openssl
将使用stderr
输出附加信息(不是真正的错误),如果没有此命令,命令将通过管道传输到 openssl x509
将失败。
这里是 IPC::Run
进来吧。我需要使用 openssl
的这个功能在 Perl 中使用 IPC::Run
因为这就是我当前使用的所有其他功能。不幸的是使用 IPC::Run
以我执行 shell 重定向的方式,例如 2>/dev/null
不工作,因为未调用 shell,运行命令并添加 2>/dev/null
将简单地将其作为参数附加到 openssl
打电话。
目前我有以下内容,无需讨厌的 stderr
即可工作。问题。也没有同意 openssl
命令来抑制它。
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";
}
所以基本上我需要丢弃 stderr
对于@cmd2,通常是用,
run \@cmd, \$in, \$out, \undef;
但是用|显示为stdin
对于@cmd3,我无法重定向 stderr
来自 @cmd2 作为 stderr
的描述符之后是stdout
。我认为必须有一种方法可以在两个管道之间使用此模块来抑制“stderr”,但我还没有弄清楚,并且对 I/O 操作不够熟悉,无法快速实现这一点。有人根据经验对此有建议吗?
最佳答案
不需要“回声”。如果您只想关闭 s_client 打开的连接,请使用关闭的标准输入。 另外,在您的示例中,您连接到 google.com:443:443,这可能是 1:443 太多了。 以下对我有用
use IPC::Run 'run';
my @cmd1 = qw(openssl s_client -connect google.com:443);
my @cmd2 = qw(openssl x509);
my $stdout = my $stderr = '';
run \@cmd1, '<', \undef, '|', \@cmd2, '2>', \$stderr, '>', \$stdout;
print $stdout;
关于Perl:使用 IPC::Run 进行 I/O 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21129154/