Как подавить вывод stdout и stderr для команды openssl?
Можно ли отключить 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 следующим образом:
$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
- Invoke-Expression ->OpenSSL Command (with redirect *>$null)
- Проблема:
Ошибка возникает из-за того, что Sub Function вызывается с ErrorAction 'Stop'
, Если я изменю его на значение по умолчанию Continue
вывод подавлен.
Чтобы все еще иметь возможность правильно обрабатывать ошибки, я сохраняю глобальное значение по умолчанию Error Action: Stop
и вручную для Invoke-Command
:
$ErrorActionPreference = 'Continue'
Invoke-Expression -Command 'openssl ... *>$null'
$ErrorActionPreference = 'Stop'
1 ответ
Не забудьте также подавить stdout
после слияния stderr
внутрь. Если это не сработает, оберните его в скрипт-блок и перенаправьте вывод всего объекта, например так:
& { .\path\to\openssl.exe $opensslCommand.Split(' ') } 2>&1 1>$null