Как заставить пинентри-ругательства запускаться на правильном tty?

13

Я использую 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

который поставляется каждый раз, когда я запускаю интерактивную оболочку. С этой настройкой все работает нормально, но есть проблема. Допустим, я:

  1. открыть терминал (запуск агента в фоновом режиме) и начать работать
  2. через некоторое время откройте второй терминал
  3. выполнить действие, которое требует ввода пароля во втором терминале

В этот момент gpg-agentначнется pinentry-cursesзапрос пароля, но он будет делать это в первом терминале, что приведет к тому, что его выходные данные будут смешаны с тем, что было запущено (обычно текстовым редактором), без возможности возобновить программу или прекратить ввод кода (он запускается с использованием 100% ЦП). и я должен убить его).

Я должен делать что-то не так здесь. Кто-нибудь испытал это?

Обновить:

Я выяснил, что это происходит только для приглашения разблокировать ключ SSH, который выглядит следующим образом , в то время как запросы для ключей PGP всегда открываются на правильном (то есть текущем) tty.

Rnhmjoj
источник
Вы пытались запустить агент из вашей оболочки входа в систему, чтобы у вас был только один запущенный?
Джейсонвриан
@jasonwryan Я только что попробовал: это то же самое для виртуальных терминалов Linux (agetty). Кстати в вопросе с терминалом я имел ввиду окно эмулятора терминала.
Rnhmjoj
1
Именно export GPG_TTY="$(tty)"это исправило это для меня
naisanza

Ответы:

10

Страница GPG-агент человек объясняет по опциону , --enable-ssh-supportчто протокол SSH агент не в состоянии обеспечить имя TTY к агенту, так что по умолчанию использует исходный терминал был начат в. Перед выполнением команды SSH , что требует пароль в новом терминале нужно набрать

gpg-connect-agent updatestartuptty /bye

в новом терминале для обновления представления агента о том, какой tty или дисплей использовать.

meuh
источник
1
Этот ответ помог мне полностью замять это понимание: люди, ответственные за gpg2это, не имеют понятия о том, что значит иметь рабочий процесс, ориентированный на командную строку / образ жизни. Каким-то образом люди, чья фундаментальная концепция типичного взаимодействия с компьютером начинается и заканчивается в границах окон GUI, вынуждены принимать решения, влияющие на инструмент, который раньше удобно использовать в командной строке.
mtraceur
2
@mtraceur Не совсем, здесь виноват ssh-agent: фактически, gpg2 будет отображать подсказку справа tty при разблокировке ключа PGP. Именно те, кто отвечает за ssh-agent, возможно, никогда не задумывались о переключении на другой tty.
Rnhmjoj
2
@Rnhmjoj Должны ли парни из SSH поддерживать сценарий переключения TTY, который не нужен инструмент командной строки для большей части истории Unix / Linux? Знаете ли вы, как выполнялся проектный мыслительный процесс и решения, какие именно части рабочего процесса обрабатывались командой, а какие - агентом? Если да, то, может быть, вы можете помочь мне увидеть то, что мне не хватает, потому что я просто не вижу четкого пути к тому, как может возникнуть необходимость в том, чтобы агент "переключал" TTY, если бы архитектура не была принята без рассмотрения типичное использование командной строки и рабочие процессы.
mtraceur
1
@ArneBabenhauserheide Разница в том, что gpgвы никогда не сможете запросить парольную фразу на неправильном терминале, тогда как это gpg2легко сделать. Команда gpgвсегда запрашивает парольную фразу на терминале, с которого вы ее выполнили, потому что на самом деле создание парольной фразы было сделано из этого дерева процессов. Но gpg2он закодирован так, что не может этого гарантировать, потому что он должен попросить отдельный длительно работающий агентский процесс запросить фразу-пароль, и этот агент мог изначально запускаться на другом терминале. gpg2и агент мог, но не был закодирован, чтобы обойти это.
mtraceur
1
@ArneBabenhauserheide Если вы не спрашиваете о разнице между агентом SSH и gpg2? Потому что если это так, то разница в том , что SSH не требуется это извращение другого инструмента , имеющего проактивно сообщить своему агенту специально для переключения терминалов в фоновом режиме (насколько я знаю , - и если это так , то у меня есть те же самые критические для него слишком ). gpg2Дизайн имеет смысл только тогда , когда осуществляются людьми , которые не ГРОК в CLI-соответствующих аспектов , как работает Linux / Unix, и не имеют хорошее чувство , что делает интерфейс и инструментальные хорошо для составления в произвольных сочетаниях.
mtraceur
5

В соответствии с вышеприведенной ошибкой в openssh, правильным способом является добавление следующего к вашему ~/.ssh/config:

Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

До сих пор это отлично сработало.

smaslennikov
источник
1
Обратите внимание, что GPG_TTYдолжно быть установлено, $(tty)чтобы сделать эту работу.
Питер