Que puis-je faire pour configurer SSH sur le client et les serveurs afin d'éviter les erreurs Write Failed: broken pipe
? Cela se produit souvent si vous mettez en veille votre ordinateur client et que vous le 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 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
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 le 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
.
Les sessions SSH peuvent être interrompues pour des raisons nombreuses et probablement inévitables.
Un utilitaire utile pouvant être utilisé pour atténuer les problèmes provoqués par ce processus s'appelle screen
. Screen est un utilitaire puissant qui vous permet de contrôler plusieurs terminaux qui resteront en vie indépendamment de la session ssh. Par exemple, si vous exécutez screen
dans une session ssh, vous verrez un nouveau terminal s'ouvrir et vous pourrez l'utiliser pour exécuter des travaux. Disons que votre session SSH meurt dans le processus. Lancer screen -d
puis screen -r
rouvrira la dernière session et vous pourrez continuer à partir de là. Assurez-vous de lire ne 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 (alias sshd), elle ne change rien du côté du client ssh. Ne l'utilisez donc pas dans le fichier de configuration ci-dessus.
Cela enverra un signal bonjour au serveur si aucun paquet n'a été reçu au cours des 30 secondes précédentes (comme spécifié ci-dessus). Toutefois, si le nombre de signaux consécutifs Bonjour-êtes-vous-vous-atteindre atteint ServerAliveCountMax, ssh se déconnectera du serveur. La valeur par défaut est 3 (donc 3 * 30 = 90 secondes sans activité du serveur), augmentez-la si cela convient à vos besoins. Il y a beaucoup plus d'options de configuration dans le fichier .ssh/config et vous pouvez lire:
tilisation d'un fichier de configuration SSH
Pour plus d'informations sur d'autres options. Vous pouvez ne pas vouloir appliquer cela à tous les serveurs auxquels vous vous connectez auxquels cet exemple le fera. Ou limitez-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 dire au serveur d'être doux avec vos clients. Le fichier de configuration est /etc/ssh/sshd_config
.
ClientAliveInterval 20
ClientAliveCountMax 5
Vous pouvez le désactiver en définissant ClientAliveInterval
sur 0
ou Tweak ClientAliveInterval
et ClientAliveCountMax
pour définir une inactivité maximale du client ssh sans répondre aux sondes. L'un des avantages de ces paramètres par rapport à TCPKeepAlive est que les signaux sont envoyés via les canaux cryptés, de sorte qu'il est moins susceptible d'être spoofable.
Je suis en train de mettre à jour un serveur Ubuntu de lucide à précis et j'ai perdu la connexion SSH au milieu de la mise à niveau avec le message "Échec de l'écriture. Tube de Brocken". 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 des messages TCP keepalive de l'autre côté. S'ils sont envoyés, la mort de la connexion ou le crash de l'une des machines sera correctement constaté. Cependant, cela signifie que les connexions mourront si la route est interrompue temporairement et que certaines personnes la trouvent ennuyeuse (la valeur par défaut est "oui").
ServerAliveInterval - Définit un intervalle de délai en secondes à l'issue duquel, si aucune donnée n'a été reçue du serveur, ssh (1) 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.
Pour le serveur, éditez votre /etc/ssh/sshd_config
comme suit:
ClientAliveInterval 600
ClientAliveCountMax 0
Si vous voulez que le client ssh quitte (temporisation) automatiquement après 10 minutes (600 secondes).
ClientAliveCountMax - Indique le nombre total de messages checkalive envoyés par le serveur ssh sans obtenir de réponse du client ssh. La valeur par défaut est 3.
ClientAliveInterval - Ceci indique le délai d'attente en secondes. Après x secondes, le serveur ssh enverra un message au client lui demandant de répondre. Deafult vaut 0 (le serveur n'enverra pas de message au client à vérifier).
Voir aussi: Que font les options ServerAliveInterval
et ClientAliveInterval
dans sshd_config, précisément?
J'aime absolument Mosh. Je me connecte fréquemment à un serveur, ferme mon ordinateur portable et vais dans un café, l'ouvre et continue comme si rien n'avait changé.
Mosh (mobile Shell)
Application de terminal distant qui permet l'itinérance , prend en charge la connectivité intermittente et fournit des écho local et édition en ligne des touches de l'utilisateur.
Mosh remplace SSH. Il est plus robuste et réactif, en particulier via les liaisons 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 non plus naviguer sur Internet localement pendant un moment. (Je me connectais à distance à Ubuntu via Terminal.)
D'autres membres de mon réseau diffusent beaucoup de vidéos de Netflix et d'autres lieux. 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 pointent du doigt pour résoudre les problèmes de réseau de leurs clients.
Si vous disposez d'une connexion par numérotation et diffusez de la vidéo ou de la musique en streaming avec une connexion SSH ou Telnet simultanée, il est inévitable qu'à un moment donné, vous obtenez un message de canal cassé. La mise à niveau du forfait haut débit de mon FAI semblait rendre ma connexion interrompue moins fréquente.
J'ai posté ma réponse ici, car ce n'était pas une machine virtuelle Ubuntu.
ssh -o IPQoS=throughput user@Host
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 pas interrompue pour une autre raison. Lorsque vous revenez à ce terminal, appuyez simplement sur CTRL + C et continuez à travailler.
Vous pouvez ajouter ces arguments chaque fois que vous appelez ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3
Vous n'avez pas besoin de modifier les fichiers/etc/ssh/* config si vous le faites.
Vous pouvez créer un alias ou une fonction ou un script bash pour faciliter la tâche.
Par exemple. ces fonctions bash, vous pouvez les ajouter à votre .bashrc, do_ssh est utilisé manuellement pour activer 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 $*
}
do_ssh user@Host
peut maintenant être utilisé ou do_ssh user@Host <args> <command>
et keepalives sera actif.