Esto será un poco más complicado, pero la combinación de varias piezas hará que funcione:
Explicación
-
Para forzar
ssh
usar$SSH_ASKPASS
programa, no puede permitirssh
para ver el verdaderotty
. Es solo condición. Esto se puede hacer usandosetsid
y usando-n
cambiar assh
.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 rompe su TTY local).
Pero puedes renunciar a la "primera sesión". También debe agregar
-N
interruptor, que suprimirá el comando remoto y hará solo la autenticación .Además, la posible salida "basura" se puede redirigir a
&> /dev/null
si no te interesa. -
Configurar
ControlMaster
enssh_config
. Es una característica interesante y una vez que se establece la conexión, puede "iniciar" sesiones bastante rápido. Este fragmento en~/.ssh/config
debería hacer eso:ControlPath ~/.ssh/controlmasters/%[email protected]%h:%p ControlMaster auto ControlPersist 5m
Puede agregar eso en algunos
host
bloquear la lista de 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 le lleve un tiempo:
setsid ssh -nN host
# wait, insert password in the X11 prompt
ssh host
# will bring you directly to your session
Todo el proceso podría simplificarse con alias
o función bash haciendo ambas cosas en un solo paso, pero se deja en la imaginación de los lectores.
Solo argumentos de línea de comandos
Puede unir ambas cosas en la línea de comandos sin ssh_config
parte:
setsid ssh -nNMS ~/.ssh/masters/%C host
# wait, insert password in the X11 prompt
ssh -S ~/.ssh/masters/%C host
# will bring you directly to your session
La siguiente función debería funcionar cuando no se especifican las opciones de SSH:
ssh() {
if ! command ssh -o PasswordAuthentication=no "$1" true
then
setsid -w ssh -fnN "$1"
fi
command ssh "[email protected]"
}
-f
indica a SSH que vaya al segundo plano justo antes de la ejecución del programa, que es después de obtener la contraseña.-w
le dice asetsid
para esperar a que termine el programa. En este caso, eso sucede cuando SSH pasa a un segundo plano. Combinado conssh -f
, se puede eliminar la espera manual entre los dos comandos SSH.- La función asume que el primer argumento es el nombre de host.
- La prueba es solo para evitar conexiones SSH innecesarias.
Un manual de SSH (man ssh
):
Si ssh
no tiene un terminal asociado pero DISPLAY y SSH_ASKPASS están configurados, ejecutará el programa especificado por SSH_ASKPASS.
Por lo tanto, debe desasociar la terminal (por ejemplo, agregando una tubería) y asegurarse de que DISPLAY
no está configurado (si desea usar la terminal para su frase de contraseña en su lugar).
Ejemplo sencillo:
echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...
Lo mismo con ssh-add
:
$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory
Con OpenSSH 8.4 puede configurar $SSH_ASKPASS_REQUIRE
variable de entorno a force
. Citando la página man de ssh(1):
SSH_ASKPASS_REQUIRE Allows further control over the use of
an askpass program. If this variable
is set to "never" then ssh will never
attempt to use one. If it is set to
"prefer", then ssh will prefer to use
the askpass program instead of the TTY
when requesting passwords. Finally, if
the variable is set to "force", then
the askpass program will be used for
all passphrase input regardless of
whether DISPLAY is set.
Dado que OpenSSH 8.4 se lanzó el 27 de septiembre de 2020, deberá esperar un poco para que esta función esté disponible en cualquier distribución importante de Linux.