Al conectarme a un servidor SSH que se comporta mal, ¿hay algún indicador o configuración que pueda usar para indicarle al cliente que se dé por vencido antes si no se accede a una consola interactiva en un corto período de tiempo?
Soy consciente de -o ConnectTimeout
que se cancelará la conexión cuando el host sea inalcanzable. En este caso, se puede acceder al host y la conexión inicial se produce rápidamente ("El servidor acepta la clave" en menos de 1 segundo), pero luego una falla en alguna capa de PAM significa que puedo obtener un símbolo del sistema real en 3 segundos, 12 segundos o nunca. La conexión se detiene hasta que envío Ctrl+C o espero 90 segundos hasta que "Se agotó el tiempo de espera de la conexión al puerto 22 [host]"
Hasta que se solucione la causa subyacente (que no busco resolver con esta pregunta), ¿hay algo que pueda hacer para mitigar el síntoma? Quiero desconectarme automáticamente si no llegamos a un mensaje útil en 5 segundos.
Respuesta1
Si la conexión subyacente es estable y nuestro objetivo principal es abrir varias sesiones sin jugar a la ruleta PAM, el modo "maestro" puede ayudar:
ssh -M -S /tmp/reusable.sock user@host
Una vez que ganes la pelea Ctrl+C/tiempo de espera de 90 segundos por primera vez, se pueden abrir otras terminales rápidamente con:
ssh -S /tmp/reusable.sock user@host
Esto funciona siempre que la conexión original se mantenga abierta. La reducción en el tiempo de conexión supone que el problema está en el paso de autenticación (ya que al multiplexar el socket de esta manera se omite la nueva autenticación)
Respuesta2
Si la conexión se detiene antes de que se configure el reenvío de puertos, podemos aprovechar un socket como semáforo y crear nuestro propio sistema de vigilancia:
lfg.sh:
#!/bin/bash
set -m
function watchdog {
sleep $1
if [[ ! -S "/tmp/lfg.$2" ]]; then
kill -STOP $3
fi
}
ssh -L /tmp/lfg.$$:localhost:1234 $1 && rm -f /tmp/lfg.$$ &
watchdog $2 $$ $! &
fg %-
Uso:
lfg grumpy-host 5
lfg
primero habilita el control del trabajo, luego inicia ssh
la solicitud de socket local /tmp/lfg.nnn
reenviado a un puerto remoto arbitrario. Al poner este trabajo en segundo plano, le pedimos a la función de vigilancia que espere 5 segundos y luego busque el socket. Si no está allí, finalice el proceso ssh estancado. fg %-
vuelve a poner ssh en primer plano, de modo que tan pronto como sea interactivo, estaremos dentro; si eso demora más de 5 segundos, regresaremos a nuestro indicador local.