Perl - 命令行输出中出现停止错误

Perl - stop error appearing in command line output

我在做什么:

我有以下反引号命令,它在一个简单的 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

我试过的:

我已经尝试并尝试了所有我知道的方法来抑制输出中的错误消息,但我尝试的任何方法都无法阻止此错误的出现。我过去做过很多类似的事情,但从未遇到过反引号的问题。我在这里明显遗漏了什么吗?

考虑使用 IPC::Run3:

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

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

它将 stdin、stdout 和 stderr 分离到不同的引用中。至少,它应该可以帮助您弄清楚发生了什么。

尝试在您的程序中重新打开 STDERR

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

您的 qx 命令的错误将不会显示。所以你不必担心你将如何调用你的程序。

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

您确定这些是错误而不是 OpenSSL 的输出(进入 STDOUT 而不是 STDERR)吗?如果您的所有预期输出都像您的示例一样以 EXP 开头,您可以尝试添加

| grep EXP

进行测试。