Pregunta:
Estoy tratando de codificar un script de shell que usa una conexión ssh para hacer "latidos". Quiero terminar el lado del cliente y del servidor de esa conexión después de un cierto tiempo de espera (después de que la conexión se interrumpe).
Lo que encontré hasta ahora:
- TCPKeepAlive sí / no para ssh y sshd
- ClientAliveCountMax para sshd
- ClientAliveInterval para sshd
- ServerAliveCountMax para ssh
- ServerAliveInterval para ssh
Para cambiar "ClientAliveCountMax" tendría que modificar sshd_config en cada máquina de destino (esta opción está deshabilitada por defecto).
Entonces, mi pregunta es: ¿puedo usar "TCPKeepAlive" para mis propósitos también (sin cambiar nada más en las máquinas de origen / destino)?
El sistema operativo de destino es SLES11 SP2, pero no creo que sea relevante aquí.
Respuesta:
Probablemente desee utilizar la configuración de ServerAlive para esto. No requieren ninguna configuración en el servidor y se pueden configurar en la línea de comandos si lo desea.
ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST
Esto enviará un mensaje ssh keepalive cada 5 segundos, y si llega el momento de enviar otro keepalive, pero no se recibió una respuesta al último, la conexión se interrumpe.
La diferencia crítica entre ServerAliveInterval
y TCPKeepAlive
es la capa en la que operan.
-
TCPKeepAlive
opera en la capa TCP. Envía un paquete TCP ACK vacío. Los cortafuegos pueden configurarse para ignorar estos paquetes, por lo que si pasa por un cortafuegos que descarta las conexiones inactivas, es posible que estas no mantengan viva la conexión. -
ServerAliveInterval
opera en la capa ssh. En realidad, enviará datos a través de ssh, por lo que el paquete TCP tiene datos cifrados y un firewall no puede decir si es un paquete activo o legítimo, por lo que funcionan mejor.