man ssh
dice:
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.
Me gustaría que SSH use un programa askpass incluso si se ejecutó desde una terminal.
En ocasiones, tengo que conectarme a servidores, donde hay algún retraso en mostrar una solicitud de contraseña (tal vez debido a problemas de red, tal vez debido a intentos de búsqueda inversa de DNS, ...). Me molesto, cambio a otra cosa y me olvido del intento de conexión. (Inserte una broma sobre la capacidad de atención de un pez dorado). Cuando finalmente vuelvo a él, el aviso expiró e incluso una contraseña correcta solo resultaría en una conexión cerrada.
Las claves serían una solución, pero no todos los sistemas que uso tienen mis claves SSH habituales. Sin embargo, generalmente uso sistemas Ubuntu, y Ubuntu tiene un programa askpass SSH instalado por defecto.
Sin embargo, si apareciera una ventana askpass, me daría cuenta de inmediato. Es un compromiso lo suficientemente bueno para mí, si tan solo puedo lograr que funcione.
/dev/tty
(LD_PRELOAD
?).Respuestas:
Esto será un poco más complicado, pero la combinación de varias piezas lo hará funcionar:
Explicación
Para forzar el
ssh
uso del$SSH_ASKPASS
programa, no puede permitirssh
ver lo realtty
. Es solo condición. Esto se puede hacer usandosetsid
y usando-n
switch tossh
.Este caso iniciaría la conexión, pero no podría interactuar con el shell, que probablemente también sea su requisito;) (y también interrumpe su TTY local).
Pero puedes renunciar a la "primera sesión". También debe agregar el
-N
interruptor, que suprimirá el comando remoto y solo realizará la autenticación .También se puede redirigir la posible salida "basura"
&> /dev/null
si no está interesado en ella.Configurar
ControlMaster
enssh_config
. Es una característica genial y una vez que se establece la conexión, puede "iniciar" las sesiones bastante rápido. Este fragmento~/.ssh/config
debe hacer eso:Puede agregar eso en algún
host
bloque que enumere sus "candidatos lentos", o simplemente en todas partes. Casi no hay gastos generales.Línea final
Entonces debería poder conectarse de esta manera al host que espera que tarde un tiempo:
Todo el proceso puede simplificarse mediante la
alias
función bash haciendo ambas cosas en un solo paso, pero queda en la imaginación del lector.Solo argumentos de línea de comando
Puede unir ambas cosas en la línea de comandos sin
ssh_config
parte:La siguiente función debería funcionar cuando no se especifican las opciones SSH:
-f
le indica a SSH que vaya al fondo justo antes de la ejecución del programa, que es después de obtener la contraseña-w
le dicesetsid
que espere a que termine el programa. En este caso, eso sucede cuando SSH pasa a un segundo plano. En combinación conssh -f
, se puede eliminar la espera manual entre los dos comandos SSH.fuente
ControlMaster
ya está configurado, precisamente porque es muy difícil ingresar contraseñas en tales casos. No debería ser difícil escribir una función que pruebe un maestro existente y use el askpass si no puede encontrar uno. ¡Gracias!A por manual SSH (
man ssh
):Por lo tanto, debe desasociar el terminal (por ejemplo, agregando una tubería) y asegurarse de que
DISPLAY
no esté configurado (si desea usar el terminal para su frase de contraseña).Ejemplo simple:
Lo mismo con
ssh-add
:fuente
Pseudo-terminal will not be allocated because stdin is not a terminal
, por lo que parece que la tubería está haciendo algo.ssh </dev/null
tuvo el mismo efecto. Sin embargo, en ambos casos todavía pide una contraseña, y todavía puedo escribir una. Intenté en Linux y Mac. Lo intentéssh -vvv
pero no dice nada útil.SSH_ASKPASS=/foo DISPLAY= setsid ssh host
funciona sin embargo.