Jak zdobyć przekleństwa pinentry, aby zacząć od właściwego tty?


13

Używam gpg-agentdo zarządzania zarówno tożsamością PGP e SSH. Agent jest uruchamiany za pomocą takiego skryptu

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

który jest pozyskiwany za każdym razem, gdy uruchamiam interaktywną powłokę. Wszystko działa dobrze z tą konfiguracją, ale jest problem. Powiedzmy, że:

  1. otwórz terminal (uruchamianie agenta w tle) i zacznij działać
  2. po chwili otwórz drugi terminal
  3. wykonaj czynność, która wymaga wprowadzenia hasła w drugim terminalu

W tym momencie gpg-agentzacznie pinentry-cursessię pojawiać monit o podanie hasła, ale zrobi to w pierwszym terminalu, co spowoduje, że jego wynik zostanie pomieszany z tym, co działało (zwykle edytor tekstowy), bez możliwości wznowienia programu lub zatrzymania pinentry (zaczyna używać 100% procesora i muszę to zabić).

Muszę tu robić coś złego. Czy ktoś tego doświadczył?

Aktualizacja:

I zorientowali się, to dzieje się tylko na monit, aby odblokować klucz SSH, który wygląda jak ten , gdy poprosi o klucze PGP zawsze otwarty na właściwej (czyli aktualnej) tty.


Czy próbowałeś uruchomić agenta z powłoki logowania, więc masz tylko tę działającą?
jasonwryan

@ jasonwryan Właśnie próbowałem: To samo dotyczy wirtualnych terminali Linux (agetty). Nawiasem mówiąc, w pytaniu dotyczącym terminala miałem na myśli okno emulatora terminala.
Rnhmjoj

1
To właśnie export GPG_TTY="$(tty)"to dla mnie
naprawiło

Odpowiedzi:


11

Strona gpg-agent mężczyzna wyjaśnia w opcji --enable-ssh-support, że protokół agenta ssh nie jest w stanie podać nazwę tty do środka, więc domyślne użyciem oryginalnego terminalu w jakiej został uruchomiony. Przed uruchomieniem komendy ssh, który wymaga hasło w nowym terminalu, który musisz wpisać

gpg-connect-agent updatestartuptty /bye

w nowym terminalu, aby zaktualizować widok agenta, którego tty lub wyświetlacza użyć.


1
Ta odpowiedź pomogła mi w pełni zapanować nad tą realizacją: osoby odpowiedzialne za gpg2nie mają pojęcia, jak to jest mieć przepływ pracy / styl życia zorientowany na wiersze poleceń. W jakiś sposób ludzie, których podstawowa koncepcja typowej obsługi komputera zaczyna się i kończy w granicach okien GUI, muszą podejmować decyzje, które wpływają na narzędzie, które wcześniej było wygodnie używane w wierszu poleceń.
mtraceur

2
@mtraceur Nie bardzo, to wina ssh-agent tutaj: w rzeczywistości gpg2 wyświetli monit po prawej stronie tty podczas odblokowywania klucza PGP. To ci odpowiedzialni za ssh-agent, którzy prawdopodobnie nigdy nie myśleli o przejściu na inny tty.
Rnhmjoj

2
@Rnhmjoj Czy faceci SSH powinni poprzeć przypadek przełączania TTY, którego nie ma narzędzie wiersza poleceń dla większości historii Uniksa / Linuksa? Czy wiesz, jak wykonano proces przemyślenia projektu i decyzje dotyczące tego, która część przepływu pracy była obsługiwana przez polecenie, a która była obsługiwana przez agenta? Jeśli tak, może pomożecie mi zobaczyć coś, za czym tęsknię, ponieważ po prostu nie widzę jasnej ścieżki do tego, jak mogłaby powstać potrzeba przełączenia TTY przez agenta, chyba że decyzja o architekturze została podjęta bez rozważenia typowe użycie i przepływy pracy z wiersza poleceń.
mtraceur

1
@ArneBabenhauserheide Różnica polega na tym, że gpgnigdy nie można poprosić o hasło na niewłaściwym terminalu, podczas gdy gpg2łatwo. gpgKomenda zawsze poprosić o haśle na terminal ty wykonywanego polecenia od ponieważ faktycznie tworząc hasło zostało zrobione z tego drzewa procesowego. Ale gpg2jest tak zakodowany, że nie może tego zapewnić, ponieważ musi poprosić o osobny, długo działający proces agenta, aby poprosić o hasło, a agent mógł początkowo uruchomić na innym terminalu. gpg2i agent mógł, ale nie był, zakodowany, aby obejść ten problem.
mtraceur

1
@ArneBabenhauserheide Chyba że pytasz o różnicę między agentem SSH a gpg2? Bo jeśli tak, to różnica jest nigdy, że SSH wymaga to wypaczenie innego oprzyrządowania mającego aktywnie powiedzieć jej agentem specjalnie do zacisków przełącznika w tle (o ile mi wiadomo - a jeśli tak to mam takie same krytyczne dla niej zbyt ). gpg2Projekt ma sens tylko wtedy, gdy realizowane przez ludzi, którzy nie Grok aspekty istotne z CLI jak Linux / Unix działa i nie mają dobre poczucie tego, co sprawia, że interfejsy i oprzyrządowania dobro do komponowania w dowolnych kombinacjach.
mtraceur

5

Jeśli chodzi o błąd nadrzędny w stosunku do openssh, właściwym sposobem jest dodanie następujących elementów do ~/.ssh/config:

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

Do tej pory działało to dla mnie idealnie.


1
Pamiętaj, że GPG_TTYnależy ustawić, $(tty)aby to działało.
Peter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.