Weisen Sie SSH an, eine grafische Eingabeaufforderung für die Passphrase des Schlüssels zu verwenden

41

Wie kann ich SSH zwingen, Passphrasen mithilfe einer grafischen Eingabeaufforderung (z. B. GTK) anzufordern, anstatt der standardmäßigen Eingabeaufforderung, die das Terminal verwendet?

Ich habe versucht einzustellen, SSH_ASKPASS=/usr/bin/ssh-askpassaber es scheint keine Auswirkungen zu haben.

Das Problem ist die Tatsache, dass die openssh-Dokumentation sagt

Wenn ssh kein Terminal zugeordnet hat, aber DISPLAY und SSH_ASKPASS festgelegt sind, führt es das von SSH_ASKPASS angegebene Programm aus und öffnet ein X11-Fenster zum Lesen der Passphrase.

Ein von der Kommandozeile aus gestartetes ssh, in meinem Fall als Ergebnis von a git push, wird mit einem Terminal assoziiert, so dass die SSH_ASKPASSLogik ignoriert zu werden scheint.

Bitte beachten Sie, dass ich mich nicht auf ssh-addssh-Aufrufe beziehe , sondern auf generische ssh-Aufrufe an Hosts, für die ein Schlüsselpaar vorhanden, aber durch eine Passphrase geschützt ist.

gioele
quelle

Antworten:

32

# 1 - Fehlendes Paket?

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

Fedora / CentOS / RHEL:

$ sudo yum install openssh-askpass

Debian / Ubuntu:

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

Suche nach fehlenden Dienstprogrammen

Mit diesen 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 verbunden?

Ich habe dies zunächst verpasst, aber nach weiterem Lesen habe ich diesen Kommentar in der Manpage sshzur SSH_ASKPASSUmgebungsvariablen bemerkt .

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 in dem Kommentar feststellen, dass ssh "kein Terminal zugeordnet hat" und DISPLAY & gesetzt SSH_ASKPASSsind. Dies zu bemerken ist der Schlüssel. Um sshes nutzen SSH_ASKPASSzu können, sshmuss kein Terminal (aka. STDIN& STDOUT) Angeschlossen sein.

Eine Möglichkeit, dies mithilfe des Befehls zu tun setsid. Fühle dich nicht schlecht. Ich habe auch noch nie von diesem Tool gehört. Von der Manpage:

setsid - Führe ein Programm in einer neuen Sitzung aus

Wenn wir also sshals "Programm" ausführen , können setsidwir uns sshvon unserem Terminal lösen, das die in sshder Manpage genannten Kriterien erfüllt . Die anderen Kriterien werden wie folgt festgelegt:

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

Also, wenn wir das alles zusammenfassen:

$ setsid ssh user@remotehost

Zum Beispiel:

$ setsid ssh user@skinner

                                       ss fragen gui

Eine Lösung

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

$ alias ssh="setsid ssh"

Wenn Sie nun sshaufgefordert werden, Ihr Passwort einzugeben, erscheint die GUI:

$ ssh user@skinner

Verweise

slm
quelle
ssh-askpass gnome ist installiert und funktioniert einwandfrei, wenn es manuell gestartet wird.
Gioele
@gioele - siehe Updates, ich denke, ich habe es herausgefunden.
SLM
Das Problem dieser Lösung ist, dass ich jeden setsid sshgit- oder rsync-Befehl ändern muss, um instad of plain zu verwenden ssh.
Gioele
@gioele - Sie haben nach einer Methode gefragt, um die Passwort-GUI zu "erzwingen". Sie können Befehle ersetzen, z. B. sshdurch Aliase setsid ssh. Es gibt andere Wege. Der limitierende Faktor ist, dass openssh kein TTY benötigt, um den ASK_SSHPASS zu aktivieren.
SLM
Ich vermisse das Paket nicht und kann es nicht verwenden setsidund dann sshvon meinem Terminal aus bearbeiten . Das ist einfach keine gültige Antwort !? Außerdem hat es in älteren Versionen von Ubuntu funktioniert, daher bin ich mir nicht sicher, warum es plötzlich nicht mehr funktioniert.
Alexis Wilke
8

Dies ist in OpenSSH derzeit nicht möglich: In OpenSSH Bugzilla ist ein Problem aufgetreten, das nach dieser Funktion ab 2013-07 fragt: Verallgemeinern Sie SSH_ASKPASS .

gioele
quelle
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Dienstag,
8
@ Cuonglm "Das ist nicht möglich" ist eine Antwort. Es könnte falsch oder irreführend sein (ich sage es nicht), aber es ist immer noch eine Antwort.
terdon
2

Es gibt eine Möglichkeit, das Terminal für einen einzelnen Befehl zu schließen. Dabei wird die Dateiumleitung verwendet:

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

Dadurch wird der Befehl ssh-addbei geschlossenem Terminal ausgeführt. Welches ist gut und dandy, abgesehen von der Komplexität. Nachdem Sie den richtigen Befehl kennen, können Sie ihn einfach als Alias ​​definieren und an Folgendes anhängen ~/.bash_aliases:

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

Und du solltest bereit sein. Durch einfaches Eingeben ssh-addwird nun der Alias ​​aufgerufen, der den eigentlichen Befehl mit der gesamten Umleitung aufruft.

Das ssh-addfragt Sie jetzt korrekt nach dem Passwort mit einem Dialogfeld ... Vorausgesetzt, Sie haben eines dieser Pakete installiert (in Ubuntu oder Derivaten können sie andere Namen haben):

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

Was bedeuten all diese Dinge?

Das 2>&1bedeutet, dass der Dateideskriptor Nr. 2 (Standardfehler) an dieselbe Stelle umgeleitet wird, an die der Dateideskriptor Nr. 1 (Standardausgabe) gerichtet ist.

> /dev/nullDies bedeutet, dass die Standardausgabe umgeleitet wird. Hierbei /dev/nullhandelt es sich um eine spezielle Datei, in der alle darauf geschriebenen Daten verworfen werden.

Das < /dev/nullbedeutet, dass die Standardeingabe nach /dev/null(idem) umgeleitet wird .

Wenn Sie einen Service in Bash programmieren möchten, müssen Sie sich als Randnotiz und als nicht themenbezogene Notiz daran erinnern, was ein Service tatsächlich ist, einen Prozess mit Standardeingabe, -ausgabe und -fehler, der im Hintergrund geschlossen ist:

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

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

Sieger
quelle
Vielen Dank für die ausführliche Antwort Victor. Es entspricht jedoch nicht meinen Anforderungen. Wie ich am Ende der Frage schrieb: "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, aber durch eine Passphrase geschützt ist."
Gioele
Aha. Nun, sshfunktioniert genauso, und die gleiche Antwort, die ich zuvor gegeben habe, gilt immer noch. Ersetzen Sie einfach jedes Vorkommen von ssh-addmit sshund Sie sind eingestellt.
Victor
Es gibt nur ein kleines Detail, das Sie vergessen haben: Wenn ich stdin / stdout für ssh schließe, wie gebe ich Befehle über ssh? ;)
gioele
Dies funktionierte für ssh-addmich - ich musste nicht einmal stdout / stderr umleiten, um das gewünschte Verhalten zu erhalten, das darin bestand, das ssh-askpassProgramm aufzurufen. (Das ssh-add < /dev/nullwar genug.)
Ben Stern
0

Ich hatte das gleiche Problem, als ich seahorse (die bereitstellen seahorse-ssh-askpass) ohne die Installation des Pakets gnome-keyringauf ArchLinux installiert habe .

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.

In jedem Fall können Sie, wenn es Ihnen nichts ausmacht, Seahorse zu verwenden, auch die Pakete seahorseund gnome-keyring(oder die entsprechenden 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 .

Fabrice
quelle