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.
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
.
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.
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.
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
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?
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é.
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.
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.
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.
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.
Lire d'autres questions sur les étiquettes ssh