Как подавить вывод stdout и stderr для команды openssl? - PullRequest
0 голосов
/ 04 января 2019

Можно ли отключить вывод stdout и stderr для следующей команды?

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, напримерthis:

$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 ведет себя аналогично.Но там вы можете изменить вывод с помощью следующих переменных среды: $env:GIT_REDIRECT_STDERR = '2>&1'

Обходной путь

  • Callstack:

Module Function - звонки -> Sub Function - Invoke-Expression -> OpenSSL Command (with redirect *>$null)

  • Проблема:

Ошибка возникает из-за того, что Подфункция вызывается с ErrorAction 'Stop'.Если я изменяю его на значение по умолчанию Continue, вывод подавляется.

Чтобы все еще иметь возможность правильно обрабатывать ошибки, я сохраняю глобальное значение по умолчанию Error Action: Stop и вручную для Invoke-Command:

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

1 Ответ

0 голосов
/ 04 января 2019

Не забудьте также подавить stdout после слияния stderr в него.Если это не сработает, оберните его в блок сценариев и перенаправьте вывод всего объекта, например так:

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