perl - Perl: I/O 重定向与 IPC::Run

  显示原文与译文双语对照的内容

使用 IPC::Run for模仿下面的内容不会在这里时产生所需的影响。 不幸的是,我不够熟悉与 IPC::Run的i/) 重定向以解决自己,我需要采用这样的知识库。

我模仿的命令


echo | openssl s_client -connect google.com:443 2>/dev/null |openssl x509

这将显示从远程服务器检索到的openssl 证书。 项工作的关键是 2>/dev/null 泵的泵,如 openssl 将使用 stderr 输出额外信息( 并不是真正的错误),而没有这个命令的命令将被管道化,将会失败。

这里是 IPC::Run 来的地方。 我需要使用 IPC::Run 在perl中使用 openssl的这个功能,这是我所有其他函数当前使用的。 但是我在 IPC::Run 中使用重定向这样的方式不会像 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"$outn";
 }

所以基本上我需要放弃 stderr的@cmd2,这通常是用


run @cmd, $in, $out, undef;

但是用| 作为 @cmd3的stdin,我不能从 @cmd2 重定向 stderr,作为 stderr的描述符,在that之后。 我想在两个管道之间使用这个模块可以有一种抑制'stderr'的方法,但是我还不熟悉 I/O 操作。 有人从经验中得到这样的建议?

时间: 作者:

不需要'回音'。如果只想关闭由s_client打开的连接,请使用关闭的标准。 在你的示例中,你连接到 google.com:443:443,它是 propable 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;

作者:
...