it-swarm.com.de

Weisen Sie SSH an, eine grafische Eingabeaufforderung für die Schlüsselpassphrase zu verwenden

Wie kann ich SSH zwingen, Passphrasen mithilfe einer grafischen Eingabeaufforderung (z. B. GTK) anstelle der Standardaufforderung anzufordern, die das Terminal verwendet?

Ich habe versucht, SSH_ASKPASS=/usr/bin/ssh-askpass Einzustellen, aber es scheint keine Auswirkungen zu haben.

Das Problem ist die Tatsache, dass in der openssh-Dokumentation steht

Wenn ssh kein Terminal zugeordnet ist, aber DISPLAY und SSH_ASKPASS gesetzt sind, führt es das durch SSH_ASKPASS angegebene Programm aus und öffnet ein X11-Fenster, um die Passphrase zu lesen.

Einem von der Befehlszeile aus gestarteten ssh, in meinem Fall als Ergebnis eines git Push, , ist ein Terminal zugeordnet Die Logik SSH_ASKPASS scheint ignoriert zu werden.

Bitte beachten Sie, dass ich mich nicht auf ssh-add Beziehe, sondern auf generische SSH-Aufrufe an Hosts, für die ein Schlüsselpaar vorhanden ist, die jedoch durch eine Passphrase geschützt sind.

43
gioele

Dies ist im aktuellen OpenSSH nicht möglich: In OpenSSH Bugzilla ist ein Problem aufgetreten, das ab 2013-07 nach dieser Funktion fragt: Generalize SSH_ASKPASS .

9
gioele

# 1 - Fehlendes Paket?

Sie vermissen wahrscheinlich das Paket, das ssh-askpass Enthält. Versuchen Sie es zu installieren.

Fedora/CentOS/RHEL:

$ Sudo yum install openssh-askpass

Debian/Ubuntu:

$ Sudo apt-get install ssh-askpass-gnome ssh-askpass

Fehlende Dienstprogramme finden

Mit den folgenden Befehlen können Sie nach fehlenden Werkzeugen suchen:

Fedora/CentOS/RHEL:

$ yum search ssh-askpass
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
======================================================= Matched: ssh-askpass =======================================================
x11-ssh-askpass.x86_64 : A passphrase dialog for X and not only for OpenSSH
ksshaskpass.x86_64 : A KDE version of ssh-askpass with KWallet support
connect-proxy.x86_64 : SSH Proxy command helper
openssh-askpass.x86_64 : A passphrase dialog for OpenSSH and X

Debian/Ubuntu:

$ apt-file -l search ssh-askpass
app-install-data
cruft
git-cola
luckybackup-data
pssh
sdm-terminal
seahorse
ssh-askpass
ssh-askpass-fullscreen
ssh-askpass-gnome

# 2 - Terminal nicht angeschlossen?

Ich habe dies anfangs verpasst, aber nach weiterem Lesen bemerkte ich diesen Kommentar in der Manpage von ssh bezüglich der Umgebungsvariablen SSH_ASKPASS.

Auszug

SSH_ASKPASS    If ssh needs a passphrase, it will read the passphrase from the 
               current terminal if it was run from a terminal.  If ssh does not
               have a terminal associated with it but DISPLAY and SSH_ASKPASS 
               are set, it will execute the program specified by SSH_ASKPASS 
               and open an X11 window to read the passphrase. This is particularly
               useful when calling ssh from a .xsession or related script.  
               (Note that on some machines it may be necessary to redirect the 
               input from /dev/null to make this work.)

Wenn Sie im Kommentar bemerken, heißt es, dass ssh "kein Terminal zugeordnet hat" [~ # ~] und [~ # ~] DISPLAY & SSH_ASKPASS sind gesetzt. Dies zu bemerken ist der Schlüssel. Damit sshSSH_ASKPASS Verwendet, muss ssh nicht an ein Terminal (auch bekannt als STDIN & STDOUT) angehängt werden dazu.

Eine Möglichkeit, dies zu tun, besteht darin, den Befehl setsid zu verwenden. Fühle dich nicht schlecht. Ich habe auch noch nie von diesem Tool gehört. Von der Manpage:

setsid - Führen Sie ein Programm in einer neuen Sitzung aus

Wenn wir also ssh als "Programm" für setsid ausführen, können wir ssh von unserem Terminal trennen und die in der Manpage von ssh genannten Kriterien erfüllen. Die anderen Kriterien werden wie folgt festgelegt:

$ echo $DISPLAY; echo $SSH_ASKPASS
:0.0
/usr/libexec/openssh/ssh-askpass

Also, wenn wir das alles zusammenfügen:

$ setsid ssh [email protected]

Zum Beispiel:

$ setsid ssh [email protected]

ss of ask gui

Eine Lösung

Wenn Sie es so gestalten möchten, dass setsid "eingebaut" ist, können Sie Aliase wie folgt erstellen:

$ alias ssh="setsid ssh"

Wenn Sie nun ssh verwenden, wird die GUI angezeigt und Sie werden nach Ihrem Passwort gefragt:

$ ssh [email protected]

Verweise

34
slm

Es gibt eine Möglichkeit, das Terminal für einen einzelnen Befehl zu schließen, und zwar mithilfe der Dateiumleitung:

ssh-add > /dev/null < /dev/null 2>&1

Dadurch wird der Befehl ssh-add Bei geschlossenem Terminal ausgeführt. Welches ist gut und gut, bis auf die Komplexität. Aber jetzt, da Sie den richtigen Befehl kennen, machen Sie ihn einfach zu einem Alias ​​und hängen Sie ihn an ~/.bash_aliases:

alias ssh-add="/usr/bin/ssh-add > /dev/null < /dev/null 2>&1"

Und du solltest eingestellt sein. Durch einfaches Eingeben von ssh-add Wird nun der Alias ​​aufgerufen, der den eigentlichen Befehl mit der gesamten Umleitung aufruft.

Der ssh-add Fragt Sie jetzt korrekt nach dem Passwort mit einem Dialogfeld ... Vorausgesetzt, Sie haben eines dieser Pakete installiert (in Ubuntu oder Derivaten haben sie möglicherweise andere Namen an anderer Stelle):

  • ssh-askpass
  • ssh-askpass-fullscreen
  • ssh-askpass-gnome
  • ksshaskpath
  • kwalletcli
  • lxqt-openssh-askpass
  • razorqt-openssh-askpasss

Was bedeuten all diese Dinge?

2>&1 Bedeutet, dass der Dateideskriptor Nr. 2 (Standardfehler) an denselben Ort umgeleitet wird, an den der Dateideskriptor Nr. 1 (Standardausgabe) gerichtet ist.

> /dev/null Bedeutet, dass die Standardausgabe an /dev/null Umgeleitet wird. Hierbei handelt es sich um eine spezielle Datei, die alle darauf geschriebenen Daten verwirft.

< /dev/null Bedeutet, dass die Standardeingabe an /dev/null (Idem) umgeleitet wird.

Als Randnotiz und als Off-Topic, aber verwandte Anmerkung, wenn Sie jemals einen Service in Bash programmieren möchten, müssen Sie sich daran erinnern, was ein Service tatsächlich ist, ein Prozess mit Standardeingabe, -ausgabe und -fehler im Hintergrund:

service > /dev/null < /dev/null 2>&1 &

Beachten Sie, dass der einzige Unterschied das am Ende hinzugefügte & ist (plus die Tatsache, dass ich den Befehl ssh-add Für ein theoretisches service geändert habe. Diese Befehle setzen einen Dienst korrekt in den Hintergrund.

5
Victor

Ich hatte das gleiche Problem, als ich Seahorse (das seahorse-ssh-askpass Bereitstellt) installierte, ohne das Paket gnome-keyring Unter ArchLinux zu installieren.

Ein Blick auf den Inhalt dieses Pakets gnome-keyring ( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) kann Ihnen bei der Lösung Ihres Problems helfen.

Wenn es Ihnen nichts ausmacht, Seepferdchen zu verwenden, können Sie auf jeden Fall auch die Pakete seahorse und gnome-keyring (Oder die entsprechenden Pakete für Ihre Distribution) installieren. Wenn Sie Gnome nicht verwenden, sind möglicherweise zusätzliche Schritte erforderlich: https://wiki.archlinux.org/index.php/GNOME_Keyring .

0
Fabrice