2

Я пытаюсь передать пароли в gpg для симметричного шифрования, но он действует так, как будто я ничего не передавал, и все равно запрашивает пароль и вводит его заново.

Вот то, что я пытаюсь (с «enter» в качестве пароля):

(echo 'enter'; echo 'enter') | gpg -c test.py

Почему это не работает?

Я уже знаю, что вы можете использовать --batch --yes --passphrase='enter' , но это покажет пароль в задаче в диспетчере задач (и поэтому кажется менее безопасным - скажите мне, если я ошибаюсь).

РЕДАКТИРОВАТЬ: я только что понял, что эхо все еще, вероятно, будет отображаться в диспетчере задач (только отдельно от команды gpg). Таким образом, чтобы обойти это, я мог сохранить пароль во временный файл и использовать cat myPasswordFile вместо echo myPassword . Таким образом, им придется получать пароль в реальном времени из временного файла (пока он существует), а не просто регистрировать все запущенные задачи и получать пароль на досуге.

1 ответ1

3

Вы можете использовать --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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .