[英]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證書。 正確工作的關鍵是stderr
的2>/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.