簡體   English   中英

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

[英]Perl: I/O Redirection with IPC::Run

使用IPC :: Run嘗試模仿以下內容目前無法為我產生所需的效果。 不幸的是,我對IPC::Run I /)重定向不夠熟悉,因此我需要利用SO的豐富知識。

命令我在模仿

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

這將顯示使用openssl從遠程服務器檢索到的SSL證書。 正確工作的關鍵是stderr2>/dev/null泵到/ dev / null,因為openssl將使用stderr輸出其他信息(不是真正的錯誤),如果沒有此命令,則將管道傳遞到openssl x509將失敗。

這是IPC::Run進入的地方。我需要使用IPC::Run在perl中使用openssl此功能,因為這是我目前所有其他功能所使用的功能。 不幸的是,使用IPC::Run以我執行shell重定向的方式IPC::Run ,例如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";
    }

因此,基本上我需要為@ cmd2放棄stderr ,通常這樣做是,

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

但是| 作為@ cmd3的stdin ,我無法從@ cmd2重定向stderr ,因為stderr的描述符在stdout的描述符之后。 我認為必須有一種方法可以在兩個管道之間使用此模塊來抑制“ stderr”,但我還沒有弄清楚,並且對I / O操作還不足夠熟悉,因此無法快速實現。 有人從經驗中得到建議嗎?

不需要“回聲”。 如果只想關閉s_client打開的連接,請使用封閉的stdin。 同樣在您的示例中,您連接到google.com:443:443可能是一個過多的: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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM