Indique a SSH que use un mensaje gráfico para la frase clave

41

¿Cómo puedo forzar a SSH a solicitar frases de contraseña usando un mensaje gráfico (GTK, por ejemplo) en lugar del estándar que usa el terminal?

Intenté configurar SSH_ASKPASS=/usr/bin/ssh-askpasspero parece no tener efectos.

El problema es el hecho de que la documentación de openssh dice

Si ssh no tiene un terminal asociado, pero DISPLAY y SSH_ASKPASS están configurados, ejecutará el programa especificado por SSH_ASKPASS y abrirá una ventana X11 para leer la frase de contraseña.

Un ssh lanzado desde la línea de comando, en mi caso como resultado de a git push, tendrá un terminal asociado, por lo que la SSH_ASKPASSlógica parece ser ignorada.

Tenga en cuenta que no me estoy refiriendo ssh-add, sino a invocaciones ssh genéricas hacia un host para el que hay un par de claves pero protegido por una frase de contraseña.

gioele
fuente

Respuestas:

32

# 1 - ¿Falta el paquete?

Probablemente te estés perdiendo el paquete que contiene ssh-askpass. Intenta instalarlo.

Fedora / CentOS / RHEL:

$ sudo yum install openssh-askpass

Debian / Ubuntu:

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

Encontrar utilidades faltantes

Puede buscar las herramientas que faltan con estos comandos:

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 desconectado?

Inicialmente me perdí esto, pero después de leer más, noté este comentario en la página del manual sshsobre la SSH_ASKPASSvariable de entorno.

extracto

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 observa en el comentario, indica que ssh "no tiene un terminal asociado" Y DISPLAY & SSH_ASKPASSestá configurado. Darse cuenta de esto es clave. Entonces, para poder sshusarlo SSH_ASKPASS, necesitamos sshno tener un terminal (también conocido como STDIN& STDOUT) conectado.

Una forma de hacerlo haciendo uso del comando setsid. No te sientas mal. Nunca escuché de esta herramienta tampoco. Desde la página del manual:

setsid: ejecuta un programa en una nueva sesión

Entonces, si corremos sshcomo el "programa" setsid, podemos desconectarnos sshde nuestra terminal y cumplir con los criterios mencionados en sshla página de manual de. Los otros criterios se establecen de la siguiente manera:

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

Entonces, si ponemos todo esto junto:

$ setsid ssh user@remotehost

Por ejemplo:

$ setsid ssh user@skinner

                                       ss de ask gui

Una solución

Si desea que setsidsea ​​"integrado", puede crear un alias de esta manera:

$ alias ssh="setsid ssh"

Ahora, cuando sshaparezca la GUI emergente, le pedirá su contraseña:

$ ssh user@skinner

Referencias

slm
fuente
ssh-askpass gnome está instalado y funciona bien si se inicia manualmente.
gioele
@gioele - ver actualizaciones, creo que lo he resuelto.
slm
El problema de esta solución es que requiere que modifique cada comando git o rsync para usar setsid sshinstad de plain ssh.
gioele
@gioele: solicitó un método para "forzar" la GUI de la contraseña, esto lo proporciona. Puede reemplazar comandos como sshcon alias setsid sshes un enfoque. Hay otras formas El factor limitante es openssh no necesita TTY conectado para activar ASK_SSHPASS.
slm
No me falta el paquete y no puedo usarlo setsidy luego trabajar sshdesde mi terminal. ¡¿Eso no es una respuesta válida en absoluto ?! Además, funcionaba en versiones anteriores de Ubuntu, así que no estoy muy seguro de entender por qué de repente dejó de funcionar.
Alexis Wilke
8

No se puede hacer en OpenSSH actual: hay un problema abierto en OpenSSH Bugzilla que solicita esta función a partir de 2013-07: Generalize SSH_ASKPASS .

gioele
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
Cuonglm
8
@cuonglm "esto no es posible" es una respuesta. Puede ser incorrecto o engañoso (no digo que lo sea), pero sigue siendo una respuesta.
terdon
2

Hay una manera de cerrar la terminal para un solo comando, y eso es usar la redirección de archivos:

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

Esto ejecutará el comando ssh-addcon el terminal cerrado. Lo cual está bien y elegante, excepto por su complejidad. Pero ahora que conoce el comando correcto, simplemente conviértalo en un alias y agréguelo a ~/.bash_aliases:

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

Y deberías estar listo. Simplemente escribiendo ssh-addahora invocará el alias que invocará el comando real con toda la redirección en su lugar.

El ssh-addahora le pregunta correctamente la contraseña con un cuadro de diálogo ... Siempre que tenga uno de estos paquetes instalados (en Ubuntu o derivados, pueden tener otros nombres en otro lugar):

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

Ahora, ¿qué significan todas esas cosas?

Los 2>&1medios redirigen el descriptor de archivo n.º 2 (error estándar) al mismo lugar al que se dirige el descriptor de archivo n.º 1 (salida estándar).

Los > /dev/nullmedios redirigen la salida estándar a /dev/null, que es un archivo especial que descarta todos los datos escritos en él.

Los < /dev/nullmedios redirigen la entrada estándar a /dev/null(idem).

Como nota al margen, y una nota fuera de tema pero relacionada, si alguna vez desea programar un servicio en bash, debe recordar qué es realmente un servicio, un proceso con entrada, salida y error estándar cerrado que está en segundo plano:

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

Tenga en cuenta que la única diferencia es el & agregado al final (más el hecho de que cambié el comando ssh-addpor un teórico service. Esos comandos pondrán correctamente un servicio en segundo plano.

Víctor
fuente
Gracias por la respuesta detallada Victor. Sin embargo, no se ajusta a mis requisitos. Como escribí al final de la pregunta, «Tenga en cuenta que no me estoy refiriendo a ssh-add, sino a invocaciones ssh genéricas hacia un host para el que hay un par de claves pero protegido por una frase de contraseña».
gioele
Veo. Bueno, sshfunciona exactamente de la misma manera, y la misma respuesta que di anteriormente todavía se aplica. Simplemente reemplace cada ocurrencia de ssh-addcon sshy ya está.
Victor
Hay un pequeño detalle que olvidó: si cierro stdin / stdout para ssh, ¿cómo doy comandos a través de ssh? ;)
gioele
Esto funcionó para ssh-addmí: ni siquiera necesitaba redirigir stdout / stderr para obtener el comportamiento deseado, que era abrir el ssh-askpassprograma. (Es decir, ssh-add < /dev/nullfue suficiente.)
Ben Stern
0

Tuve el mismo problema cuando instalé seahorse (que proporciona seahorse-ssh-askpass) sin instalar el paquete gnome-keyringen ArchLinux.

Mirar el contenido de este paquete gnome-keyring( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) puede ayudarlo a resolver su problema.

En cualquier caso, si no le importa usar seahorse, también puede instalar los paquetes seahorsey gnome-keyring(o los equivalentes para su distribución). Si no usa Gnome, se pueden requerir pasos adicionales: https://wiki.archlinux.org/index.php/GNOME_Keyring .

Fabrice
fuente