Di 'a SSH di usare un prompt grafico per la passphrase chiave


41

Come posso forzare SSH a richiedere passphrase utilizzando un prompt grafico (GTK, ad esempio) anziché quello standard che utilizza il terminale?

Ho provato a impostare SSH_ASKPASS=/usr/bin/ssh-askpassma sembra non avere effetti.

Il problema è il fatto che dice la documentazione di openssh

Se ssh non ha un terminale associato ma sono impostati DISPLAY e SSH_ASKPASS, eseguirà il programma specificato da SSH_ASKPASS e aprirà una finestra X11 per leggere la passphrase.

Un ssh lanciato dalla riga di comando, nel mio caso come risultato di a git push, avrà un terminale ad esso associato, quindi la SSH_ASKPASSlogica sembra essere ignorata.

Si noti che non mi riferisco a ssh-add, ma a invocazioni ssh generiche verso host per i quali è presente una coppia di chiavi ma protetta da una passphrase.

Risposte:


32

# 1 - Pacchetto mancante?

Probabilmente ti manca il pacchetto che contiene ssh-askpass. Prova a installarlo.

Fedora / CentOS / RHEL:

$ sudo yum install openssh-askpass

Debian / Ubuntu:

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

Trovare utilità mancanti

Puoi cercare gli strumenti mancanti usando questi comandi:

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 - Terminale disconnesso?

Inizialmente l'ho perso, ma dopo un'ulteriore lettura ho notato questo commento nella pagina man sshriguardante la SSH_ASKPASSvariabile d'ambiente.

estratto

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.)

Se si nota nel commento, afferma che ssh "non ha un terminale associato" E DISPLAY & SSH_ASKPASSsono impostati. Notare che questa è la chiave. Quindi per sshpoter usare SSH_ASKPASSdobbiamo sshavere un terminale (aka. STDIN& STDOUT) Collegato.

Un modo per farlo usando il comando setsid. Non stare male. Non ho mai sentito parlare di questo strumento. Dalla pagina man:

setsid - esegue un programma in una nuova sessione

Quindi, se corriamo sshcome "programma" setsid, possiamo staccarci sshdal nostro terminale soddisfacendo i criteri menzionati nella sshpagina di manuale. Gli altri criteri sono impostati come segue:

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

Quindi, se mettiamo tutto insieme:

$ setsid ssh user@remotehost

Per esempio:

$ setsid ssh user@skinner

                                       chiedi di gui

Una soluzione

Se vuoi farlo in modo che setsidsia "incorporato" puoi creare un alias in questo modo:

$ alias ssh="setsid ssh"

Ora quando sshviene visualizzata la GUI che richiede la password:

$ ssh user@skinner

Riferimenti


ssh-askpass gnome è installato e funziona bene se lanciato manualmente.
gioele,

@gioele - vedi gli aggiornamenti, penso di averlo capito.
slm

il problema di questa soluzione è che richiede che setsid sshmodifico ogni comando git o rsync per usare instad di plain ssh.
gioele,

@gioele: hai richiesto un metodo per "forzare" la GUI della password, a condizione che. È possibile sostituire comandi come sshcon gli alias setsid sshè un approccio. Ci sono altri modi Il fattore limitante è che opensh non ha bisogno di TTY per poter attivare ASK_SSHPASS.
slm

Non mi manca il pacchetto e non posso usarlo setside poi lavorare sshdal mio terminale. Questa non è una risposta valida a tutti !? Inoltre, funzionava nelle versioni precedenti di Ubuntu, quindi non sono troppo sicuro di capire perché improvvisamente ha smesso di funzionare!
Alexis Wilke,

8

Non può essere fatto nell'attuale OpenSSH: c'è un problema aperto in OpenSSH Bugzilla che richiede questa funzione a partire dal 2013-07: Generalize SSH_ASKPASS .


Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post.
cuonglm

8
@cuonglm "Questo non è possibile" è una risposta. Potrebbe essere sbagliato o fuorviante (non sto dicendo che lo sia), ma è ancora una risposta.
terdon

2

C'è un modo per chiudere il terminale per un singolo comando e quello sta usando il reindirizzamento dei file:

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

Questo eseguirà il comando ssh-addcon il terminale chiuso. Che va bene e dandy, tranne per la sua complessità. Ma ora che conosci il comando corretto, rendilo semplicemente un alias e aggiungilo a ~/.bash_aliases:

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

E dovresti essere pronto. La semplice digitazione ssh-addora invocherà l'alias che invocherà il comando reale con tutto il reindirizzamento in atto.

L' ssh-addora si chiede correttamente la password con una finestra di dialogo ... A condizione che si dispone di uno di questi pacchetti installati (in Ubuntu o derivati, possono avere altri nomi altrove):

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

Ora, cosa significano tutte quelle cose?

I 2>&1mezzi reindirizzare descrittore di file # 2 (standard error) nello stesso posto descrittore di file # 1 (standard output) è diretto a.

I > /dev/nullmezzi reindirizzare lo standard output ad /dev/null, che è un file speciale che elimina tutti i dati scritti sul supporto.

I < /dev/nullmezzi standard input a /dev/null(idem).

Come nota a margine e come off topic ma nota correlata, se mai si desidera programmare un servizio in bash, è necessario ricordare che cos'è effettivamente un servizio, un processo con input, output ed errore standard chiusi in background:

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

Si noti che l'unica differenza è & aggiunto alla fine (oltre al fatto che ho cambiato il comando ssh-addper un teorico service. Quei comandi metteranno correttamente un servizio in background.


Grazie per la risposta dettagliata Victor. Tuttavia, non soddisfa i miei requisiti. Come ho scritto alla fine della domanda, "Notare che non mi riferisco a ssh-add, ma a invocazioni ssh generiche verso host per i quali è presente una coppia di chiavi ma protette da una passphrase.".
gioele,

Vedo. Bene, sshfunziona esattamente allo stesso modo, e la stessa risposta che ho dato in precedenza si applica ancora. Sostituisci semplicemente ogni ricorrenza di ssh-addcon sshe sei pronto.
Victor,

C'è solo un piccolo dettaglio che hai dimenticato: se chiudo stdin / stdout per ssh, come posso dare comandi tramite ssh? ;)
gioele

Questo ha funzionato per ssh-addme - non ho nemmeno bisogno di reindirizzare stdout / stderr per ottenere il comportamento desiderato, che è stato quello di far apparire il ssh-askpassprogramma. (Cioè, ssh-add < /dev/nullera abbastanza.)
Ben Stern il

0

Ho avuto lo stesso problema quando ho installato cavalluccio marino (che fornisce seahorse-ssh-askpass) senza installare il pacchetto gnome-keyringsu ArchLinux.

Guardare il contenuto di questo pacchetto gnome-keyring( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) può aiutarti a risolvere il tuo problema.

In ogni caso, se non ti dispiace usare il cavalluccio marino, puoi anche installare i pacchetti seahorsee gnome-keyring(o quelli equivalenti per la tua distribuzione). Se non usi Gnome, potrebbero essere necessari passaggi aggiuntivi: https://wiki.archlinux.org/index.php/GNOME_Keyring .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.