【问题标题】:Perl - stop error appearing in command line outputPerl - 命令行输出中出现停止错误
【发布时间】:2015-02-08 21:28:37
【问题描述】:

我在做什么:

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

我尝试过的:

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

【问题讨论】:

  • 使用2&gt;/dev/null 是正确的方法。你确定它不起作用吗?
  • 是的,我肯定遇到了错误(如上所示),我认为 2>/dev/null 是正确的方法,这也是它让我感到困惑的原因。该错误只能来自此反引号命令,并且它是脚本正在执行的唯一“有意义”的事情(即脚本中没有其他面向连接或反引号命令)。所以我不明白为什么 2>/dev/null 没有捕捉到错误。

标签: bash perl error-handling output backticks


【解决方案1】:

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

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

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

附:如果需要,您也可以保存您的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;
    

    它将标准输入、标准输出和标准错误分离为不同的引用。至少,它应该可以帮助您弄清楚发生了什么。

    【讨论】:

      【解决方案3】:

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

      | grep EXP
      

      测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 2010-11-18
        • 2021-03-02
        • 2013-07-29
        • 1970-01-01
        • 2020-04-04
        相关资源
        最近更新 更多