Вы можете использовать --passphrase-fd 0
чтобы сказать gpg, что нужно читать пароль из stdin. Это должно хорошо ладить с трубами. Не отправляйте это дважды; это требуется только для обнаружения опечаток, когда вы делаете это в интерактивном режиме.
Обычно gpg читает из tty, поэтому вы можете перенаправлять как ввод, так и вывод, и при этом иметь возможность вводить фразу-пароль.
В обычном сеансе входа ваша оболочка подключается к терминалу с помощью трех файловых дескрипторов: stdin, stdout и stderr. Каналы и операторы перенаправления меняются там, где указываются эти файловые дескрипторы.
Если вы запускаете команду без каких-либо операторов перенаправления, все ее файловые дескрипторы наследуются от оболочки. Когда он читает из стандартного ввода, он читает из tty.
Если вы запускаете ту же команду с оператором <
перенаправления, его стандартный ввод соединяется с файлом, имя которого появляется после <
. Если вы поместите команду на правой стороне |
оператор, его стандартный ввод связан с дескриптором файла канала (противоположный конец которого подключен к стандартному выводу команды в левой части |
.)
Это то, что вы, наверное, уже знали. Что вы не знали, так это то, что помимо файловых дескрипторов есть еще одна вещь, которая связывает терминалы и процессы: управляющий терминал. У вашего процесса оболочки есть управляющий терминал, и он наследуется всеми дочерними процессами, в том числе и вашим gpg
.
Когда программа хочет получить ввод с клавиатуры от пользователя, несмотря на то, что stdin не является терминалом, она может получить доступ к своему управляющему терминалу, открыв специальный файл /dev/tty
.
Одним из видов программ, которые сильно зависят от этой функции, является пейджер (например, more
, less
). Если вы запустите somecommand | less
, чего less
хочет сделать, так это прочитать некоторые данные из канала на stdin, отобразить первый экран и затем прочитать с клавиатуры, чтобы дождаться, пока вы нажмете клавишу, чтобы сказать, что делать дальше. stdin не может быть одновременно трубой и клавиатурой, поэтому less
открывается /dev/tty
.
Управляющий терминал для процесса указан в столбце TTY
ps
.