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 se caiga la conexión).
Lo que encontré hasta ahora:
- TCP KeepAlive sí/no para ssh y sshd
- ClientAliveCountMax para sshd
- ClientAliveInterval para sshd
- ServerAliveCountMax para ssh
- Intervalo de vida del servidor para ssh
Para cambiar "ClientAliveCountMax", tendría que modificar sshd_config en cada máquina de destino (esta opción está deshabilitada de manera predeterminada).
Así que mi pregunta es:¿puedo usar "TCPKeepAlive" también para mis propósitos (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 aceptada:
Probablemente quiera usar la configuración de ServerAlive para esto. No requieren ninguna configuración en el servidor y se pueden establecer 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, entonces la conexión se termina.
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 se pueden configurar para ignorar estos paquetes, por lo que si pasa por un cortafuegos que elimina las conexiones inactivas, es posible que no mantengan la conexión viva.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 saber si es un paquete keepalive o legítimo, por lo que funcionan mejor.