2015-02-08 59 views
0

我有一個問題,我希望有人能幫助用...的Perl - STOP錯誤出現在命令行輸出

我在做什麼:

我有在執行以下命令反引號一個簡單的foreach循環並保存命令輸出到一個變量,然後我該變量執行的字符串匹配操作:

$ciphertestoutput = `echo -n | openssl s_client -cipher $tlsCipher -connect $ipaddress:443 2>/dev/null`; 

問題:

但是,當我在輸出中運行我的腳本時,出現一條錯誤消息,我似乎無法停止顯示。我並不擔心這個錯誤會發生,但我不希望在我所做的漂亮的命令行輸出中顯示錯誤。

我的輸出和錯誤:

EXP-DES-CBC-SHA CIPHER IS SUPPORTED on 192.168.1.22:443 

EXP-EDH-DSS-DES-CBC-SHA CIPHER IS NOT SUPPORTED on 192.168.1.22.443 

EXP-RC2-CBC-MD5 CIPHER IS NOT SUPPORTED on 192.168.1.22:443 
connect: Connection refused   <--- the error I cant get rid of 
connect:errno=111     <--- the error I cant get rid of 

EXP-RC4-MD5 CIPHER IS NOT SUPPORTED on 192.168.1.22:443 

我曾嘗試:

我曾嘗試與辦法,我知道的,以抑制輸出錯誤信息所有的方式嘗試,但沒有任何我嘗試防止出現此錯誤。我過去做過很多類似的事情,從來沒有用反引號來解決這個問題。有什麼明顯的我在這裏失蹤?

您對我們的幫助是非常讚賞,感謝

+1

使用'2>/dev/null'是正確的方法。你確定它不工作? – 2015-02-08 21:37:33

+0

是的,我肯定得到了錯誤(完全如上所示),我認爲2>/dev/null是正確的方式來做到這一點,這就是爲什麼它也讓我感到困惑。錯誤只能來自這個反引號命令,並且它是腳本唯一的'有意義'的事情(即在腳本中沒有其他面向連接的命令或反向命令)。所以我不明白爲什麼2>/dev/null沒有發現錯誤。 – 2015-02-08 21:48:26

回答

4

嘗試重新在你的程序STDERR這樣的:你qx -command將不會被顯示的

open STDERR, '>/dev/null';  
# your command 

錯誤。所以你不必擔心你將如何打電話給你的程序。

P.S.你還可以保存你的STDERR如果你需要它:

open OLDERR, ">&", \*STDERR; # or die "$!"; 
open STDERR, ">/dev/null"; # or die "$!"; 
# your command 
open STDERR, ">&OLDERR"; # restoring your stderr 
close OLDERR; 
# other code 
2

考慮使用IPC::Run3

use IPC::Run3; # Exports run3() by default 

run3 \@cmd, \$in, \$out, \$err; 

其標準輸入,標準輸出,和標準錯誤分離到不同的引用。至少,它應該幫助你弄清楚發生了什麼。

-1

你確定這是從OpenSSL的錯誤和不輸出(來stdout,而不是STDERR)?如果你所有的期望輸出與EXP開始喜歡你例如,你可以嘗試添加

| grep EXP 

測試。