web-dev-qa-db-fra.com

Dites à SSH d'utiliser une invite graphique pour la phrase de passe clé

Comment puis-je forcer SSH à demander des mots de passe à l'aide d'une invite graphique (GTK, par exemple) au lieu de celle standard qui utilise le terminal?

J'ai essayé de définir SSH_ASKPASS=/usr/bin/ssh-askpass mais cela semble n'avoir aucun effet.

Le problème est le fait que la documentation openssh dit

Si ssh n'a pas de terminal associé mais DISPLAY et SSH_ASKPASS sont définis, il exécutera le programme spécifié par SSH_ASKPASS et ouvrira une fenêtre X11 pour lire la phrase secrète.

Un ssh lancé depuis la ligne de commande, dans mon cas à la suite d'un git Push, aura un terminal associé, donc le SSH_ASKPASS la logique semble être ignorée.

Veuillez noter que je ne parle pas de ssh-add, mais aux invocations ssh génériques vers des hôtes pour lesquels une paire de clés est présente mais protégée par une phrase secrète.

43
gioele

Cela ne peut pas être fait dans OpenSSH actuel: il y a un problème ouvert dans OpenSSH Bugzilla demandant cette fonctionnalité à partir de 2013-07: Generalize SSH_ASKPASS .

9
gioele

# 1 - Paquet manquant?

Vous manquez probablement le package qui contient ssh-askpass. Essayez de l'installer.

Fedora/CentOS/RHEL:

$ Sudo yum install openssh-askpass

Debian/Ubuntu:

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

Recherche des utilitaires manquants

Vous pouvez rechercher les outils manquants à l'aide de ces commandes:

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 déconnecté?

Au départ, cela m'a manqué, mais après une lecture plus approfondie, j'ai remarqué ce commentaire dans la page de manuel de ssh concernant le SSH_ASKPASS variable d'environnement.

extrait

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

Si vous remarquez dans le commentaire, il indique que ssh "n'a pas de terminal associé" [~ # ~] et [~ # ~] DISPLAY & SSH_ASKPASS sont définis. Le remarquer est la clé. Donc, pour que ssh utilise SSH_ASKPASS nous devons obtenir ssh pour ne pas avoir de terminal (aka. STDIN & STDOUT) attaché.

Une façon de le faire en utilisant la commande setsid . Ne te sens pas mal. Je n'ai jamais entendu parler de cet outil non plus. Depuis la page de manuel:

setsid - exécute un programme dans une nouvelle session

Donc, si nous exécutons ssh comme "programme" vers setsid, nous pouvons détacher ssh de notre terminal répondant aux critères mentionnés dans la page de manuel de ssh. Les autres critères sont fixés comme suit:

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

Donc, si nous mettons tout cela ensemble:

$ setsid ssh user@remotehost

Par exemple:

$ setsid ssh user@skinner

ss of ask gui

Une solution

Si vous souhaitez que le setsid soit "intégré", vous pouvez créer un alias comme ceci:

$ alias ssh="setsid ssh"

Maintenant, lorsque vous ssh, vous obtiendrez l'interface graphique vous demandant votre mot de passe:

$ ssh user@skinner

Références

34
slm

Il existe un moyen de fermer le terminal pour une seule commande, et qui utilise la redirection de fichiers:

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

Cela exécutera la commande ssh-add avec le terminal fermé. Ce qui est fin et dandy, sauf pour sa complexité. Mais maintenant que vous connaissez la bonne commande, faites-en simplement un alias et ajoutez-le à ~/.bash_aliases:

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

Et vous devriez être prêt. Il suffit de taper ssh-add va maintenant invoquer l'alias qui invoquera la vraie commande avec toute la redirection en place.

Le ssh-add vous demande maintenant correctement le mot de passe avec une boîte de dialogue ... A condition que l'un de ces packages soit installé (dans Ubuntu ou dérivés, ils peuvent avoir d'autres noms ailleurs):

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

Maintenant, que signifient toutes ces choses?

Le 2>&1 signifie rediriger le descripteur de fichier # 2 (erreur standard) vers le même emplacement que le descripteur de fichier # 1 (sortie standard) est dirigé vers.

Le > /dev/null signifie rediriger la sortie standard vers /dev/null, qui est un fichier spécial qui supprime toutes les données qui y sont écrites.

Le < /dev/null signifie rediriger l'entrée standard vers /dev/null (idem).

En guise de note secondaire, et hors sujet mais note connexe, si jamais vous souhaitez programmer un service en bash, vous devez vous rappeler ce qu'est réellement un service, un processus avec des entrées, sorties et erreurs standard fermées en arrière-plan:

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

Notez que la seule différence est le & ajouté à la fin (plus le fait que j'ai changé la commande ssh-add pour un théorique service. Ces commandes mettront correctement un service en arrière-plan.

5
Victor

J'ai eu le même problème lorsque j'ai installé Seahorse (qui fournit seahorse-ssh-askpass) sans installer le package gnome-keyring sur ArchLinux.

En regardant le contenu de ce package gnome-keyring ( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) peut vous aider à résoudre votre problème.

Dans tous les cas, si cela ne vous dérange pas d'utiliser Seahorse, vous pouvez également installer les packages seahorse et gnome-keyring (ou les équivalents pour votre distribution). Si vous n'utilisez pas Gnome, des étapes supplémentaires peuvent être nécessaires: https://wiki.archlinux.org/index.php/GNOME_Keyring .

0
Fabrice