J'essaie de coder un script shell qui utilise une connexion ssh pour faire des "battements de coeur". Je souhaite mettre fin aux côtés client et serveur de cette connexion après un certain délai (après l'interruption de la connexion).
Ce que j'ai trouvé jusqu'à présent :
- TCPKeepAlive oui/non pour ssh et sshd
- ClientAliveCountMax pour sshd
- ClientAliveInterval pour sshd
- ServerAliveCountMax pour ssh
- ServerAliveInterval pour ssh
Pour changer "ClientAliveCountMax", je devrais modifier le sshd_config sur chaque machine cible (cette option est désactivée par défaut).
Ma question est donc :puis-je également utiliser "TCPKeepAlive" pour mes besoins (sans rien changer d'autre sur les machines source/cible) ?
Le système d'exploitation cible est SLES11 SP2 - mais je ne pense pas que ce soit pertinent ici.
Réponse acceptée :
Vous souhaitez probablement utiliser les paramètres de ServerAlive pour cela. Ils ne nécessitent aucune configuration sur le serveur et peuvent être définis en ligne de commande si vous le souhaitez.
ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST
Cela enverra un message ssh keepalive toutes les 5 secondes, et s'il est temps d'envoyer un autre keepalive, mais qu'aucune réponse au dernier n'a été reçue, la connexion est interrompue.
La différence critique entre ServerAliveInterval
et TCPKeepAlive
est la couche à laquelle ils opèrent.
TCPKeepAlive
fonctionne sur la couche TCP. Il envoie un paquet TCP ACK vide. Les pare-feu peuvent être configurés pour ignorer ces paquets, donc si vous passez par un pare-feu qui supprime les connexions inactives, ceux-ci peuvent ne pas maintenir la connexion active.ServerAliveInterval
fonctionne sur la couche ssh. Il enverra en fait des données via ssh, de sorte que le paquet TCP contient des données cryptées et un pare-feu ne peut pas dire s'il s'agit d'un paquet keepalive ou d'un paquet légitime, donc cela fonctionne mieux.