J'ai trouvé cette question , mais je suis désolé de ne pas bien comprendre les paramètres des deux variables ServerAliveInterval
et ClientAliveInterval
mentionnées dans la réponse acceptée. Si mon serveur local arrive à expiration, dois-je définir cette valeur à zéro? Sera-t-il alors jamais expirer? Dois-je plutôt le régler à 300 secondes ou quelque chose?
Ma question est simplement: certaines de mes connexions expirent lorsque je suspends puis remets en veille mon ordinateur portable avec la réponse Write failed: Broken pipe
et certains non. Comment puis-je configurer correctement un sshd local afin qu'il n'échoue pas avec un tube cassé?
ServerAliveInterval : nombre de secondes pendant lesquelles le client attendra avant d'envoyer un paquet nul au serveur (pour maintenir la connexion active) .
ClientAliveInterval : nombre de secondes pendant lesquelles le serveur attendra avant d'envoyer un paquet nul au client (pour maintenir la connexion active) .
La définition d'une valeur de 0 (la valeur par défaut) désactivera ces fonctionnalités afin que votre connexion puisse chuter si elle est inactive pendant trop longtemps.
ServerAliveInterval semble être la stratégie la plus courante pour maintenir une connexion en vie. Pour éviter le problème de pipe cassé, voici la configuration ssh que j'utilise dans mon fichier .ssh/config:
Host myhostshortcut
HostName myhost.com
User barthelemy
ServerAliveInterval 60
ServerAliveCountMax 10
Le paramètre ci-dessus fonctionnera de la manière suivante,
ClientAliveCountMax côté serveur peut également aider. Il s'agit de la limite de la durée pendant laquelle un client est autorisé à ne pas répondre avant d'être déconnecté. La valeur par défaut est 3, comme dans trois ClientAliveInterval.
Ceci est expliqué dans sshd_config
manuel (man sshd_config
):
ClientAliveInterval
Définit un délai d'expiration en secondes après lequel si aucune donnée n'a été reçue du client, sshd enverra un message via le canal crypté pour demander une réponse au client. La valeur par défaut est 0, indiquant que ces messages ne seront pas envoyés au client. Cette option s'applique uniquement à la version 2 du protocole.
ClientAliveCountMax
La valeur par défaut est 3. Si
ClientAliveInterval
(voir ci-dessous) est défini sur 15 et queClientAliveCountMax
est laissé par défaut, les clients SSH qui ne répondent pas seront déconnectés après environ 45 secondes. Cette option s'applique uniquement à la version 2 du protocole.
Pour les options client, voir l'explication dans man ssh_config
:
ServerAliveInterval
Définit un délai d'expiration en secondes après lequel si aucune donnée n'a été reçue du serveur,
ssh
enverra un message via le canal crypté pour demander une réponse du serveur. La valeur par défaut est 0, indiquant que ces messages ne seront pas envoyés au serveur. Cette option s'applique uniquement à la version 2 du protocole.
ServerAliveCountMax
La valeur par défaut est 3. Si, par exemple,
ServerAliveInterval
est défini sur 15 etServerAliveCountMax
est laissé par défaut, si le serveur ne répond plus,ssh
se déconnectera après environ 45 secondes. Cette option s'applique uniquement à la version 2 du protocole.
D'après ce qui précède, 0 signifie qu'il est désactivé. Par conséquent, vous devez définir ces valeurs suffisamment haut pour éviter l'erreur Pipe cassée.
La réponse de Barthelemy est cool mais ne va pas vraiment à la racine du problème. Vous suspendez votre machine et souhaitez que la session SSH soit toujours en vie lorsque vous démarrez votre ordinateur.
Il n'y a pas une telle configuration pour ssh qui maintienne la connexion en vie comme ça. SSH utilise TCP, pour commencer, vous avez besoin de la prise de contact à trois voies, puis restez en vie après un certain temps d'inactivité. Lorsque vous fermez/mettez en veille prolongée toutes vos connexions TCP sont fermées avec FIN. Aucun moyen de surmonter cela.
Pour une solution de contournement sale, vous pouvez utiliser VPS ou une autre boîte en ligne avec écran pour conserver la connexion. Mon conseil ne le fait pas pour des raisons de sécurité.
Puisque vous ne pouvez pas garantir qu'une connexion SSH (étant TCP) restera active une fois qu'une extrémité cessera d'envoyer des ACK aux paquets reçus, j'utilise personnellement http://www.harding.motd.ca/autossh/ = pour redémarrer toutes mes connexions SSH presque dès que je suspends.
Étant donné que GNU Screen sera utilisé du côté serveur, le fait de le rattacher me ramène là où j'étais auparavant.
Vous pouvez l'écouter sur des ports supplémentaires afin qu'il vérifie continuellement que les connexions sont toujours actives, mais personnellement, je trouve que cela fonctionne assez bien avec celui désactivé et en s'appuyant simplement sur le propre ServerAliveInterval
/ServerAliveCountMax
de SSH.
Une autre option est http://mosh.mit.edu/ qui utilise UDP et se rétablit de manière transparente du manque de connectivité à long terme.
Vous pouvez également exécuter des commandes avec Nohup
si vous souhaitez qu'elles s'exécutent quelle que soit votre connexion SSH.
par exemple.
$ Nohup tar -xzf some_huge.tar.gz &
Le &
n'est pas, je pense, nécessaire, mais c'est pratique car il fait tourner le processus en arrière-plan pour que vous puissiez faire d'autres choses.
J'utilise toujours Nohup pour tout processus qui prend un certain temps, de sorte que je n'ai pas à recommencer si je perds la connexion pour une raison quelconque - panne de courant (à mon emplacement distant, pas sur l'hôte évidemment), panne de réseau, peu importe.
Mettez votre longue session de course à l'intérieur de l'écran Voir écran -h pour plus de détails
De cette façon, vous pouvez vous reconnecter à la machine en utilisant ssh et rattacher à la session écran