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