Як змусити прокляття-прокляття, щоб почати на правильному tty?


13

Я використовую gpg-agentдля управління обома ідентифікаторами PGP e 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 завжди відкриті на правильному (тобто поточного) терміналі.


Ви спробували запустити агент із своєї оболонки для входу, щоб у вас працював лише той?
Jasonwryan

@jasonwryan Я щойно спробував: це те ж саме для віртуальних терміналів Linux (agetty). До речі, у питанні з терміналом я мав на увазі вікно емулятора терміналу.
Rnhmjoj

1
Саме export GPG_TTY="$(tty)"це зафіксувало для мене
naisanza

Відповіді:


11

Сторінка " gpg-agent man" пояснює, що параметр --enable-ssh-supportssh agent не може надати агенту ім'я tty, тому він за замовчуванням використовує початковий термінал, з якого він був запущений. Перш ніж запустити команду ssh, яка вимагає парольну фразу в новому терміналі, яку потрібно ввести

gpg-connect-agent updatestartuptty /bye

у новому терміналі, щоб оновити уявлення агента, які tty або дисплеї використовувати.


1
Ця відповідь допомогла мені повністю приховати це усвідомлення: люди, відповідальні за gpg2, не мають поняття про те, що це таке, щоб мати робочий процес / спосіб життя, орієнтований на командний рядок. Якимось чином люди, чия основна концепція типового досвіду користувачів комп’ютера починається і закінчується в межах вікна GUI, повинні приймати рішення, які впливають на інструмент, який раніше був зручним для використання в командному рядку.
mtraceur

2
@mtraceur Насправді тут не помилка ssh-агента: насправді gpg2 відобразить підказку праворуч під час розблокування ключа PGP. Це відповідальні за ssh-агент, які, можливо, ніколи не думали про перехід на інший 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"

Це до цього часу для мене спрацювало чудово.


1
Зауважте, що для цієї роботи GPG_TTYпотрібно встановити $(tty).
Пітер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.