Perl:使用 IPC::Run 进行 I/O 重定向

标签 perl io openssl ipc

使用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/

相关文章:

Perl 使用 IO::Uncompress::AnyUncompress 读取 zip 文件

Perl 兼容性

shell - 在 dart :io library, 中,为什么要设置 runInShell : true when calling Process. 运行?

java - Java I/O PrintStream 的线程安全

openssl - 如何将二进制 key 传递给 openssl

ssl - SSL证书中的sct列表是什么?

c++ - 从 OpenSSL 中的私钥中提取公钥

perl - 一台服务器的 whois TCP 套接字连接失败

perl - 获取当前进程的 perl 可执行文件的绝对路径

Haskell IO(字符串)和字符串