如何抑制openssl命令的stdout和stderr输出?

时间:2019-01-04 08:14:29

标签: powershell openssl libressl

是否可以为以下命令禁用stdoutstderr输出?

req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout ./private.key -out ./mycert.crt -subj "/C=DE/ST=BW/L=Karlsruhe/O=foobar/OU=foobar/CN=foobar"

该命令始终会产生以下输出,我想取消显示:

Generating a 2048 bit RSA private key
.............................................
.............................................................+++
........................................+++
writing new private key to './private.key'

我已经尝试使用2>&1的任何变体来重定向输出,但是由于以下原因,他在这种情况下不起作用:

openssl命令在这样的Powershell会话中执行:

$opensslCommand = 'req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout ./private.key -out ./mycert.crt -subj "/C=DE/ST=BW/L=Karlsruhe/O=foobar/OU=foobar/CN=foobar"'
Invoke-Expression -Command $opensslCommand

同样,PowerShell流的重定向也不起作用。 根本不会有问题,但是如果您以非交互方式运行命令,则openssl输出将发送到stderr而不是stdout

Git的行为类似。但是您可以使用以下环境var更改输出:$env:GIT_REDIRECT_STDERR = '2>&1'

解决方法

  • 呼叫堆栈:
  

Module Function-通话-> Sub Function-调用表达-> OpenSSL Command (with redirect *>$null)

  • 问题:

发生错误是因为用ErrorAction 'Stop'调用了 Sub Function 。如果我将其更改为默认的Continue,则会抑制输出。

为了仍然能够进行适当的错误处理,我保留了全局默认设置Error Action: Stop并手动为Invoke-Command设置:

$ErrorActionPreference = 'Continue'
Invoke-Expression -Command 'openssl ... *>$null'
$ErrorActionPreference = 'Stop'

1 个答案:

答案 0 :(得分:0)

请记住,在将stdout合并到stderr之后,也应禁止它。如果不起作用,请将其包装在脚本块中,然后重定向整个内容的输出,如下所示:

& { .\path\to\openssl.exe $opensslCommand.Split(' ') } 2>&1 1>$null