Wie kann man Pinentry-Flüche dazu bringen, mit der richtigen Tty zu beginnen?

13

Ich verwende gpg-agentzum Verwalten beider PGP- und SSH-Identitäten. Der Agent wird mit einem solchen Skript gestartet

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

Das wird immer dann bezogen, wenn ich eine interaktive Shell ausführe. Mit diesem Setup funktioniert alles einwandfrei, aber es gibt ein Problem. Sagen wir ich:

  1. Öffnen Sie ein Terminal (starten Sie den Agenten im Hintergrund) und beginnen Sie zu arbeiten
  2. Nach einer Weile öffnen Sie ein zweites Terminal
  3. Führen Sie eine Aktion aus, bei der im zweiten Terminal eine Passphrase eingegeben werden muss

An diesem Punkt gpg-agentwird pinentry-curseseine Passphrase abgefragt, dies wird jedoch im ersten Terminal ausgeführt, was dazu führt, dass die Ausgabe mit dem, was gerade ausgeführt wurde (normalerweise ein Texteditor), gemischt wird, ohne dass das Programm fortgesetzt oder die Pinentry gestoppt werden kann (es beginnt mit der Verwendung von 100% CPU) und ich muss es töten).

Ich muss hier etwas falsch machen. Hat das jemand erlebt?

Aktualisieren:

Ich fand heraus , geschieht dies nur für eine Aufforderung einen SSH - Schlüssel, die aussieht wie zu entsperren diese , während Ansagen für PGP - Schlüssel immer offen auf der richtigen (dh Strom) tty.

Rnhmjoj
quelle
Haben Sie versucht, den Agenten über Ihre Login-Shell zu starten, sodass nur der eine ausgeführt wird?
Jasonwryan
@ jasonwryan Ich habe gerade versucht: Es ist das gleiche für virtuelle Linux-Terminals (agetty). Übrigens meinte ich in der Frage mit Terminal ein Terminalemulatorfenster.
Rnhmjoj
1
Es war das export GPG_TTY="$(tty)", was es für mich
behoben

Antworten:

9

In der Manpage gpg-agent wird unter der Option erläutert, --enable-ssh-supportdass das ssh-Agentenprotokoll dem Agenten nicht den Namen des tty bereitstellen kann. Daher wird standardmäßig das ursprüngliche Terminal verwendet, in dem es gestartet wurde. Bevor der Befehl ssh ausgeführt wird, für den a erforderlich ist Passphrase in einem neuen Terminal, das Sie eingeben müssen

gpg-connect-agent updatestartuptty /bye

im neuen Terminal, um die Ansicht des Agenten zu aktualisieren, welche tty oder Anzeige verwendet werden soll.

meuh
quelle
1
Diese Antwort hat mir geholfen, diese Erkenntnis vollständig zu erstarren: Die Verantwortlichen gpg2haben keine Vorstellung davon, wie es ist, einen befehlszeilenorientierten Workflow / Lebensstil zu haben. Irgendwie mussten Personen, deren grundlegendes Konzept einer typischen Computerbenutzererfahrung innerhalb der Grenzen von GUI-Fenstern beginnt und endet, Entscheidungen treffen, die sich auf ein Tool auswirken, das zuvor bequem über die Befehlszeile verwendet werden konnte.
mtraceur
2
@mtraceur Nicht wirklich, hier ist ssh-agent schuld: Tatsächlich zeigt gpg2 beim Entsperren eines PGP-Schlüssels die Eingabeaufforderung auf der rechten Seite an. Es sind die Verantwortlichen von ssh-agent, die möglicherweise nie daran gedacht haben, zu einem anderen tty zu wechseln.
Rnhmjoj
2
@Rnhmjoj Sollten die SSH-Leute einen TTY-Switching-Anwendungsfall unterstützt haben, den kein Befehlszeilentool für den größten Teil der Unix / Linux-Geschichte wollte? Wissen Sie, wie der Entwurfsgedankenprozess und die Entscheidungen für welchen Teil des Workflows vom Befehl und welcher vom Agenten ausgeführt wurden? Wenn ja, können Sie mir vielleicht helfen, etwas zu erkennen, das mir fehlt, weil ich einfach keinen klaren Weg erkennen kann, wie die Notwendigkeit für den Agenten, TTYs zu "wechseln", überhaupt entstehen würde, wenn die Architektur nicht ohne Berücksichtigung festgelegt würde typische Befehlszeilennutzung und Workflows.
mtraceur
1
@ArneBabenhauserheide Der Unterschied ist, dass gpgman niemals auf dem falschen Terminal nach der Passphrase fragen kann, wohingegen dies gpg2leicht möglich ist. Der gpgBefehl fragt immer nach der Passphrase auf dem Terminal, von dem aus Sie den Befehl ausgeführt haben, da das eigentliche Erstellen der Passphrase über diesen Prozessbaum erfolgt ist. Ist gpg2jedoch so codiert, dass dies nicht sichergestellt werden kann, da ein separater, lang laufender Agentenprozess aufgefordert werden muss, nach der Passphrase zu fragen, und dieser Agent möglicherweise ursprünglich auf einem anderen Terminal gestartet wurde. gpg2und der Agent konnte, wurde aber nicht codiert, um das zu umgehen.
mtraceur
1
@ArneBabenhauserheide Es sei denn, Sie fragen nach dem Unterschied zwischen SSH-Agent und gpg2? Denn wenn dem so ist , dann ist der Unterschied , dass SSH nie diese Perversion der anderen Werkzeuge , die mit proaktiv seinen Agenten zu Schalteranschlüsse im Hintergrund speziell sagen (soweit ich weiß - und wenn es so wäre , dann habe ich die gleichen Kritikpunkte für sie zu ). Das gpg2Design ist nur dann sinnvoll, wenn es von Personen implementiert wird, die die CLI-relevanten Aspekte der Funktionsweise von Linux / Unix nicht kennen und nicht genau wissen, was Schnittstellen und Tools für das Komponieren in beliebigen Kombinationen gut macht.
mtraceur
5

Gemäß dem Upstream - Bug gegen OpenSSH, die richtige ist Weg , um dieses Hinzufügen der folgenden auf Ihre ~/.ssh/config:

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

Das hat bei mir bisher perfekt funktioniert.

smaslennikov
quelle
1
Beachten Sie, dass GPG_TTYdies eingestellt sein muss $(tty), damit dies funktioniert.
Peter