Question Comment empêcher «Write Failed: pipe cassée» sur la connexion SSH?


Que puis-je faire pour configurer SSH sur le client et les serveurs pour empêcher Write Failed: broken pipe les erreurs? Cela se produit souvent si vous dormez votre ordinateur client et reprenez plus tard.


232
2018-04-28 23:36


origine


Rien de vraiment. La session a été interrompue et la sécurité de la session a été compromise. Si vous ne mettez pas la compil en veille, vous pouvez définir un temps mort pour que le client tire sur le serveur, mais si le système s'endort, rien ne peut être fait. - darkdragn
Dans ce cas, je cherche quelque chose qui me permettrait de relancer une connexion ssh cassée (basée probablement sur le code de sortie) et de restaurer en utilisant screen? - sorin
Vous avez tort: ​​j'ai deux machines clientes de bureau connectées au serveur SAME. L'un est Ubuntu 12.10, Quantal, dont le client SSH fonctionne bien et conserve la connexion pendant des heures. L'autre est Ubuntu 14.10, Utopic, juste à côté de l'autre et dans une nouvelle installation; au bout de quelques minutes, il se bloque avec ce message. Les autres fonctions réseau de la machine ne sont pas interrompues. Donc non, ce n'est ni un problème de réseau, ni un problème de serveur, mais un problème spécifique au logiciel SSH CLIENT, qui peut être résolu, contrairement à ce que "darkdragan" ose dire, "rien ne peut être fait". - David L
Et en effet, comme je le disais: les gens parlent trop quand ils disent "rien ne peut être fait", tout comme @darkdragn. J'ai lu la réponse d 'Aram Kocharyan, et je l' ai appliquée: il ya 20 minutes ... J'ai réalisé que dans mon ancien Quantal Ubuntu 12.10, j'avais appliqué cette instruction dans ce fichier [je viens de vérifier], il y a deux ans. la raison de la stabilité là-bas. Je l'ai fait ici et dans ces 20 dernières minutes, la connexion est stable depuis. Alors, s'il vous plaît, les gens: évitez-vous de penser que «rien ne peut être fait», et abstenez-vous de plus en essayant de laisser ce message à d'autres personnes. - David L
@DavidL, vous devriez mieux lire les questions avant de vous plaindre. Votre problème n'est pas le même que celui de l'OP, qui mentionne clairement la mise en veille de l'ordinateur. Qui d'ailleurs ne répond qu’une des réponses ("mosh"), et elle a été postée 2 ans après la question. Cependant, les autres réponses sont la meilleure solution, qui consiste à proposer des solutions aux cas qui peuvent être résolus plus facilement, comme le vôtre. Détendez-vous, ne soyez pas si stressé, les coups de feu ne font rien de bon ici ... - msb


Réponses:


J'ai essayé ceci dans /etc/ssh/ssh_config pour Linux et Mac:

Host *
ServerAliveInterval 120

C'est la fréquence à laquelle, en quelques secondes, il doit envoyer un message keepalive au serveur. Si cela ne fonctionne pas, entraînez un singe à appuyer sur Entrée toutes les deux minutes pendant que vous travaillez.

Vous pouvez définir soit ServerAliveInterval dans /etc/ssh/ssh_config de la machine client ou ClientAliveInterval dans /etc/ssh/sshd_config de la machine serveur. Essayez de réduire l'intervalle si vous obtenez toujours l'erreur.

La configuration pour un seul utilisateur peut être définie dans un fichier ~/.ssh/config à la fois du côté serveur et du côté client. Assurez-vous que le fichier dispose des autorisations correctes chmod 644 ~/.ssh/config.


211
2018-05-26 11:49



Ouais je fais pareil et ça marche assez bien pour la plupart des choses. - Oli♦
Je ne suis pas sur Mac, mais Ubuntu 12.04 et le fichier correspondant à ce système d'exploitation semblent également être ~ / .ssh / config. - H2ONaCl
OS X 10.8.4 donne une erreur Bad configuration option: ClientAliveInterval - ohho
Je l'obtiens Bad configuration option erreur sur OSX 10.8.4. - Nick Heiner
Généralement, vous placez ces deux commandes dans différentes parties du système. Seul ServerAliveInterval du côté du client OSX ... et uniquement ClientAliveInterval sur le fichier de configuration sshd ... - ftrotter


Les sessions SSH peuvent être interrompues pour des raisons nombreuses et peut-être inévitables.

Un utilitaire utile qui peut être utilisé pour atténuer les problèmes causés par ceci est appelé screen. Screen est un utilitaire puissant qui vous permet de contrôler plusieurs terminaux qui resteront actifs indépendamment de la session ssh. Par exemple, si vous exécutez screen Dans une session ssh, vous verrez un nouveau terminal ouvert et vous pourrez l'utiliser pour exécuter des travaux. Disons que votre session ssh meurt dans le processus. Fonctionnement screen -d puis screen -r rouvrira la dernière session et vous pourrez continuer à partir de là. Assurez-vous de lire une partie de la documentation avant de l'utiliser.


70
2017-10-04 16:28



C'est probablement la meilleure réponse, je ne suis pas sûr pourquoi il n'a pas été voté plus haut. Les autres "correctifs" sont utiles dans le cas particulier où vous souhaitez réellement maintenir une connexion SSH, mais dans la plupart des cas d'utilisation, j'imagine que le véritable problème est que les processus prévus continuent à s'exécuter, quels que soient les problèmes de connexion client / serveur. . - Paul McMurdie
J'ajouterais aussi Tmux comme alternative à l'écran. Je le trouve plus polyvalent et plus stable que l'écran. - fridaymeetssunday
il suffit de laisser ceci ici pour référence future - vous pouvez facilement exécuter screen -d -r pour récupérer votre dernière session. - doplumi
Ou simplement screen -dr. Ou screen -x en fonction de ce que vous comptez faire. Le fait est que l'on doit savoir ce que font tous ces commutateurs, de manière à pouvoir utiliser les bons et non simplement suivre aveuglément les suggestions des internautes. Il y a un bon résumé compact disponible ici: Ss64.com/bash/screen.html - flith


Configuration du client

Essayez de créer le fichier:

~/.ssh/config

Ajouter le contenu:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Maintenant ssh sur votre serveur et voir si votre problème est résolu. L'option ClientAliveInterval n'est utile que lors de la configuration du serveur ssh (aka sshd), elle ne change rien du côté du client ssh, donc ne l'utilisez pas dans le fichier de configuration ci-dessus.

Cela enverra un signal hello-are-you-there au serveur si aucun paquet n'a été reçu dans les 30 secondes précédentes (comme indiqué ci-dessus). Toutefois, si le nombre de signaux hello-are-you-there consécutifs atteint ServerAliveCountMax, ssh se déconnectera du serveur. Cette valeur est par défaut à 3 (donc 3 * 30 = 90 secondes sans activité du serveur), augmentez-la si elle convient à vos besoins. Il y a beaucoup d'autres options de configuration dans le fichier .ssh / config et vous pouvez lire:

Utiliser un fichier de configuration SSH

Pour plus d'informations sur les autres options. Vous ne souhaiterez peut-être pas l'appliquer à tous les serveurs auxquels vous vous connectez, comme dans cet exemple. Ou le restreindre à un serveur particulier en remplaçant la ligne Host * avec Host <IP> (remplacer par une adresse IP, voir la page de manuel ssh_config).

Configuration du serveur

De même, vous pouvez demander au serveur de faire preuve de douceur avec vos clients. Le fichier de configuration est /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

Vous pouvez soit le désactiver en définissant ClientAliveInterval à 0 ou tweak ClientAliveInterval et ClientAliveCountMax définir une inactivité maximale du client ssh sans répondre aux sondes. Un des avantages de ces paramètres par rapport à TCPKeepAlive est que les signaux sont envoyés via les canaux chiffrés, ce qui réduit les risques d’être usurpables.


40
2017-10-06 02:54



Ça ne marche pas Je suis de nouveau confronté à la même erreur. - user997704
Essayez-le directement depuis la ligne de commande et allez plus bas: ssh -o ServerAliveInterval = 5 user @ host - Matt
J'ai essayé ça aussi ... ça ne marche pas. Je ne sais vraiment pas ce qui se passe avec mon système - user997704
C'est ClientAliveCountMax, NOT ClientAliveMaxCount - David G
@DavidG S'il vous plaît éditer la réponse avec vos corrections. - CivMeierFan


Je mets à jour à distance un serveur Ubuntu de lucid à ​​précis et j'ai perdu la connexion ssh au milieu de la mise à niveau avec le message "Write failed. Brocken pipe". ClientAliveInterval et ServerAliveInterval n'ont rien fait. La solution consiste à activer les options TCPKeepAlive dans le client ssh:

TCPKeepAlive yes

dans

/etc/ssh/ssh_config

22
2017-10-07 18:40





Pour le client, modifiez votre ~/.ssh/config (ou /etc/ssh/ssh_config) fichier comme suit:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - Spécifie si le système doit envoyer TCP keepalive   messages de l'autre côté. S'ils sont envoyés, mort de la connexion   ou le crash de l'une des machines sera correctement remarqué. cependant,   cela signifie que les connexions mourront si la route est temporairement en panne,   et certaines personnes trouvent cela ennuyant (la valeur par défaut est «oui»).

ServerAliveInterval - Définit un intervalle de temporisation en secondes après lequel   Si aucune donnée n'a été reçue du serveur, ssh (1) enverra un message   message à travers 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é au serveur.


Pour le serveur, modifiez votre /etc/ssh/sshd_config comme:

ClientAliveInterval 600
ClientAliveCountMax 0

Si vous voulez que le client ssh quitte (timeout) automatiquement après 10 minutes (600 secondes).

ClientAliveCountMax - Ceci indique le nombre total de coïncidence   message envoyé par le serveur ssh sans obtenir de réponse de la part du   ssh client. La valeur par défaut est 3.

ClientAliveInterval - Ceci indique le délai d'attente en secondes. Après x   nombre de secondes, le serveur ssh enverra un message au client demandant   pour réponse. Deafult est 0 (le serveur n’enverra pas de message au client pour   vérifier.).


Voir également: Que font les options ServerAliveInterval et ClientAliveInterval dans sshd_config faire, précisément?


18
2017-10-02 13:52





J'adore absolument Mosh. Je ssh souvent dans un serveur, fermez mon ordinateur portable et allez dans un café, ouvrez-le et continuez comme si rien n'avait changé.

Mosh (coque mobile)

Application de terminal distant qui permet roaming, les soutiens intermittent   connectivité, et fournit intelligent local   écho et modification de ligne des frappes utilisateur.

Mosh est un remplacement pour SSH. C'est plus robuste et réactif,   en particulier sur Wi-Fi, cellulaire et les liaisons longue distance.

Mosh est un logiciel gratuit, disponible pour GNU / Linux, FreeBSD, Solaris, Mac OS X et Android.


15
2017-09-30 18:48





Pour moi, je devenais Write failed: Broken pipe même lorsque je tapais activement dans vim ou à l'invite du shell. Je ne pouvais pas naviguer sur Internet localement pendant un certain temps non plus. (Je me connectais à distance à Ubuntu en utilisant Terminal.)

D'autres utilisateurs de mon réseau diffusent beaucoup de vidéo depuis Netflix et d'autres endroits. Je ne peux pas le prouver, mais je soupçonne que c'est un problème de FAI ou de routeur. Par exemple, Verizon et Netflix se montrent du doigt les problèmes de réseau de leurs clients.

Si vous avez une connexion par ligne commutée et que vous diffusez de la vidéo ou de la musique avec une connexion SSH ou Telnet simultanée, il est inévitable que vous receviez un message de panne. La mise à niveau de mon forfait haut débit ISP semblait rendre ma connexion brisée moins fréquente.


4
2017-07-30 13:33





J'ai un script sur le serveur distant qui ne semble jamais échouer, quel que soit le client ou le serveur de configuration SSH.

#!/bin/bash
while true; do date; sleep 10; done;

Enregistrez-le dans un fichier dummy.sh et exécutez-le rapidement avant de réduire la fenêtre ou de vous en éloigner. Il continuera à imprimer l’horodatage actuel sur le serveur et maintiendra votre connexion en vie tant que la connexion n’est supprimée pour aucune autre raison. Lorsque vous revenez à ce terminal, appuyez simplement sur CTRL + C et continuez à travailler.


3
2017-09-09 16:50



ou simplement laisser top fonctionnement - Eben Geer


Vous pouvez ajouter ces arguments chaque fois que vous invoquez ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

Vous n'avez pas à éditer les fichiers de configuration / etc / ssh / * si vous faites cela.

Vous pouvez créer un alias, une fonction ou un script bash pour rendre cela facile.

Par exemple. ces fonctions bash, vous pouvez ajouter dans votre .bashrc, do_ssh est utilisé manuellement pour activer les keepalives. do_ssh_pty est utilisé dans les scripts pour définir pty et éviter les invites.

do_ssh() {
    ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

do_ssh_pty() {
    ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

À présent do_ssh user@host peut être utilisé ou do_ssh user@host <args> <command> et keepalives seront actifs.


0
2018-02-12 13:05