Indiquez à SSH d'utiliser une invite graphique pour la phrase secrète clé

41

Comment puis-je forcer SSH à demander des phrases secrètes à l'aide d'une invite graphique (GTK, par exemple) au lieu de l'invite standard utilisant le terminal?

J'ai essayé le réglage SSH_ASKPASS=/usr/bin/ssh-askpassmais cela ne semble pas avoir d'effet.

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

Si ssh n'a pas de terminal associé mais que 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 la SSH_ASKPASSlogique semble être ignorée.

Veuillez noter que je ne fais pas référence à ssh-add, mais à des 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.

gioele
la source

Réponses:

32

# 1 - Paquet manquant?

Vous manquez probablement le paquet 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

Trouver les services publics 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ébut, cela me manquait, mais après une lecture plus approfondie, j’ai remarqué ce commentaire dans la page de manuel sshrelative à la SSH_ASKPASSvariable 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 est indiqué que ssh "n'a pas de terminal associé" ET DISPLAY & SSH_ASKPASSsont définis. Noter que c'est la clé. Donc, pour pouvoir sshutiliser, SSH_ASKPASSnous devons sshne pas avoir de terminal (ou. STDIN& STDOUT).

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

setsid - lance un programme dans une nouvelle session

Ainsi, si nous exécutons sshle programme, setsidnous pouvons nous détacher sshde notre terminal en respectant les critères mentionnés dans sshla page de manuel de. Les autres critères sont définis 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

                                       demande de gui

Une solution

Si vous voulez faire en sorte que le setsid"soit intégré", vous pouvez créer un alias comme ceci:

$ alias ssh="setsid ssh"

Maintenant, quand vous sshaurez l’interface graphique qui vous demandera votre mot de passe:

$ ssh user@skinner

Les références

slm
la source
ssh-askpass gnome est installé et fonctionne correctement s'il est lancé manuellement.
Gioele
@gioele - voir les mises à jour, je pense que j'ai compris.
slm
le problème de cette solution est qu’elle nécessite que je modifie chaque commande git ou rsync pour utiliser setsid sshinstad of plain ssh.
Gioele
@gioele - vous avez demandé une méthode pour "forcer" l'interface graphique du mot de passe, cela vous le permet. Vous pouvez remplacer des commandes telles que sshpar des alias, setsid sshune approche. Il y a d'autres moyens. Le facteur limitant est que openssh n’a pas besoin de téléscripteur pour pouvoir activer ASK_SSHPASS.
slm
Je ne manque pas le paquet et je ne peux pas utiliser setsidet ensuite travailler à sshpartir de mon terminal. Ce n'est tout simplement pas une réponse valable!? De plus, cela fonctionnait dans les anciennes versions d'Ubuntu, donc je ne suis pas sûr de comprendre pourquoi cela a soudainement cessé de fonctionner!
Alexis Wilke
8

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

gioele
la source
Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son message.
jeudi
8
@cuonglm "ce n'est pas possible" est une réponse. Cela peut être faux ou trompeur (je ne le dis pas), mais c'est toujours une réponse.
terdon
2

Il existe un moyen de fermer le terminal pour une seule commande, en utilisant la redirection de fichier:

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

Cela exécutera la commande ssh-addavec le terminal fermé. Ce qui est bien et dandy, sauf pour sa complexité. Mais maintenant que vous connaissez la commande correcte, 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 vous ssh-addsuffira maintenant de taper l'invocation de l'alias pour appeler la commande réelle avec toute la redirection en place.

Le ssh-addmaintenant vous demande correctement le mot de passe avec une boîte de dialogue ... Pourvu que l'un de ces paquetages soit installé (sous Ubuntu ou ses dérivés, ils peuvent porter d'autres noms ailleurs):

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

Maintenant, qu'est-ce que toutes ces choses veulent dire?

Le 2>&1moyen de redirection du descripteur de fichier n ° 2 (erreur standard) vers le même descripteur de fichier de lieu n ° 1 (sortie standard) est dirigé vers.

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

Les < /dev/nullmoyens redirigent l'entrée standard vers /dev/null(idem).

En tant que note parallèle et note secondaire, si vous souhaitez programmer un service dans bash, vous devez vous rappeler ce qu’il en est réellement: un processus avec entrée standard, sortie et erreur fermée 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-addpour une valeur théorique service. Ces commandes mettront correctement un service en arrière-plan.

Victor
la source
Merci pour la réponse détaillée Victor. Cependant, cela ne correspond pas à mes exigences. Comme je l'ai écrit à la fin de la question, "Veuillez noter que je ne fais pas référence à ssh-add, mais à des 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.".
gioele
Je vois. Eh bien, sshfonctionne exactement de la même manière, et la réponse que j’avais donnée précédemment est toujours valable. Il suffit de remplacer chaque occurrence de ssh-addavec sshet vous êtes prêt.
Victor
Vous avez oublié un détail: si je ferme stdin / stdout pour ssh, comment puis-je donner des commandes via ssh? ;)
gioele
Cela a fonctionné pour ssh-addmoi - je n'ai même pas eu besoin de rediriger stdout / stderr pour obtenir le comportement souhaité, qui consistait à faire apparaître le ssh-askpassprogramme. (Cela ssh-add < /dev/nullsuffisait.)
Ben Stern
0

J'ai eu le même problème quand j'ai installé seahorse (qui fournit seahorse-ssh-askpass) sans installer le paquet gnome-keyringsur ArchLinux.

Le contenu de ce paquet 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 seahorseet 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 .

Fabrice
la source