Я использую gpg-agent
для управления обоими удостоверениями PGP и SSH. Агент запускается с помощью такого скрипта
gpg_agent_env="$XDG_CACHE_HOME/gpg-agent.env"
export GPG_TTY="$(tty)"
if ! ps -U "$USER" -o ucomm | grep -q gpg-agent; then
eval "$({gpg-agent --daemon | tee $gpg_agent_env} 2> /dev/null)"
else
source "$gpg_agent_env" 2> /dev/null
fi
который поставляется каждый раз, когда я запускаю интерактивную оболочку. С этой настройкой все работает нормально, но есть проблема. Допустим, я:
- открыть терминал (запуск агента в фоновом режиме) и начать работать
- через некоторое время откройте второй терминал
- выполнить действие, которое требует ввода пароля во втором терминале
В этот момент gpg-agent
начнется pinentry-curses
запрос пароля, но он будет делать это в первом терминале, что приведет к тому, что его выходные данные будут смешаны с тем, что было запущено (обычно текстовым редактором), без возможности возобновить программу или прекратить ввод кода (он запускается с использованием 100% ЦП). и я должен убить его).
Я должен делать что-то не так здесь. Кто-нибудь испытал это?
Обновить:
Я выяснил, что это происходит только для приглашения разблокировать ключ SSH, который выглядит следующим образом , в то время как запросы для ключей PGP всегда открываются на правильном (то есть текущем) tty.
export GPG_TTY="$(tty)"
это исправило это для меняОтветы:
Страница GPG-агент человек объясняет по опциону ,
--enable-ssh-support
что протокол SSH агент не в состоянии обеспечить имя TTY к агенту, так что по умолчанию использует исходный терминал был начат в. Перед выполнением команды SSH , что требует пароль в новом терминале нужно набратьв новом терминале для обновления представления агента о том, какой tty или дисплей использовать.
источник
gpg2
это, не имеют понятия о том, что значит иметь рабочий процесс, ориентированный на командную строку / образ жизни. Каким-то образом люди, чья фундаментальная концепция типичного взаимодействия с компьютером начинается и заканчивается в границах окон GUI, вынуждены принимать решения, влияющие на инструмент, который раньше удобно использовать в командной строке.gpg
вы никогда не сможете запросить парольную фразу на неправильном терминале, тогда как этоgpg2
легко сделать. Командаgpg
всегда запрашивает парольную фразу на терминале, с которого вы ее выполнили, потому что на самом деле создание парольной фразы было сделано из этого дерева процессов. Ноgpg2
он закодирован так, что не может этого гарантировать, потому что он должен попросить отдельный длительно работающий агентский процесс запросить фразу-пароль, и этот агент мог изначально запускаться на другом терминале.gpg2
и агент мог, но не был закодирован, чтобы обойти это.gpg2
Дизайн имеет смысл только тогда , когда осуществляются людьми , которые не ГРОК в CLI-соответствующих аспектов , как работает Linux / Unix, и не имеют хорошее чувство , что делает интерфейс и инструментальные хорошо для составления в произвольных сочетаниях.В соответствии с вышеприведенной ошибкой в openssh, правильным способом является добавление следующего к вашему
~/.ssh/config
:До сих пор это отлично сработало.
источник
GPG_TTY
должно быть установлено,$(tty)
чтобы сделать эту работу.