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

229

Que puis-je faire pour configurer SSH sur les clients et les serveurs afin d’éviter les erreurs Write Failed: broken pipe ? Cela se produit souvent si vous dormez votre ordinateur client et reprenez plus tard.

    
posée sorin 29.04.2012 - 01:36
la source

9 réponses

209

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 ServerAliveInterval en /etc/ssh/ssh_config de la machine cliente ou ClientAliveInterval en /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 le fichier ~/.ssh/config à la fois sur le serveur et sur le client. Assurez-vous que les autorisations du fichier sont correctes chmod 644 ~/.ssh/config .

    
réponse donnée Aram Kocharyan 26.05.2012 - 13:49
la source
70

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

Un utilitaire utile pouvant ê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. En cours d'exécution 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.

    
réponse donnée eltommo 04.10.2012 - 18:28
la source
40

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 voyez 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é 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 plus d'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 restreignez-le à un serveur particulier en remplaçant la ligne Host * par Host <IP> (remplacez-la par une adresse IP, voir la page de manuel ssh_config).

Configuration du serveur

De même, vous pouvez demander au serveur d’être doux 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 modifier ClientAliveInterval et ClientAliveCountMax pour 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 les rend moins susceptibles d’être usurpables.

    
réponse donnée Matt 06.10.2013 - 04:54
la source
21

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
    
réponse donnée Alexey Sviridov 07.10.2012 - 20:40
la source
18

Pour le client, éditez votre fichier ~/.ssh/config (ou /etc/ssh/ssh_config ) 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 en tant que:

ClientAliveInterval 600
ClientAliveCountMax 0

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

  

ClientAliveCountMax - Indique le nombre total de coïncidences   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 : 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 aussi: Que font les options? ServerAliveInterval et ClientAliveInterval dans sshd_config font, précisément?

    
réponse donnée kenorb 02.10.2014 - 15:52
la source
15

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 (shell mobile)

     

Application de terminal distant qui permet itinérance , prend en charge intermittent   connectivité , et fournit une locale intelligente   echo et édition de ligne des frappes d’utilisateur.

     

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

     

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

    
réponse donnée Jake 30.09.2014 - 20:48
la source
4

Pour moi, je recevais 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éos depuis Netflix et ailleurs. 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 qu’à un moment donné, vous recevez un message de panne. La mise à niveau de mon forfait haut débit ISP semblait rendre ma connexion rompue moins fréquente.

    
réponse donnée Parag Magunia 30.07.2014 - 15:33
la source
3

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.

    
réponse donnée JulioHM 09.09.2013 - 18:50
la source
0

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 vous faciliter la tâche.

E.g. 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 $*
}

Maintenant, do_ssh [email protected] peut être utilisé ou do_ssh [email protected] <args> <command> et keepalives seront actifs.

    
réponse donnée gaoithe 12.02.2018 - 14:05
la source

Lire d'autres questions sur les étiquettes