Que signifie le message de canal cassé dans une session SSH?

103

Parfois, ma session SSH se déconnecte avec un Write failed: Broken pipemessage. Qu'est-ce que ça veut dire? Et comment puis-je garder ma session ouverte?

Je sais à propos screen, mais ce n'est pas la réponse que je cherche. Je pense que c'est une sshdoption de configuration.

Peter Stuifzand
la source

Réponses:

89

Il est possible que votre serveur ferme trop longtemps les connexions inactives. Vous pouvez mettre à jour votre client ( ServerAliveInterval) ou votre serveur ( ClientAliveInterval)

 ServerAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the server, ssh(1) will send a message through
         the encrypted channel to request a response from the server.  The
         default is 0, indicating that these messages will not be sent to
         the server.  This option applies to protocol version 2 only.

 ClientAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the client, sshd(8) will send a message
         through the encrypted channel to request a response from the
         client.  The default is 0, indicating that these messages will
         not be sent to the client.  This option applies to protocol
         version 2 only.

Pour mettre à jour votre serveur (et redémarrez votre sshd)

echo "ClientAliveInterval 60" | sudo tee -a /etc/ssh/sshd_config

Ou côté client:

echo "ServerAliveInterval 60" >> ~/.ssh/config 
Gert
la source
NB que parfois "* AliveInterval" n'est pas assez stackoverflow.com/questions/10665267/…
rogerdpack
1
Il n'y a pas ~/.ssh/configsur mon Mac, est-ce que je dois le créer ici ou c'est ailleurs?
AGamePlayer
5
@AwQiruiGuo Oui, vous devez d'abord créer le répertoire ( ~/.ssh). Somkdir -p ~/.ssh; chmod 700 ~/.ssh; touch ~/.ssh/config
Gert
6

Une solution alternative serait d'utiliser mosh- le shell mobile . Contrairement à SSH, il se connecte via UDP et prend en charge l'itinérance. Vous pouvez commencer votre session à la maison, suspendre votre ordinateur portable, l'amener au travail / entre amis / partout où vous avez Internet, suspendre votre ordinateur portable et continuer à travailler comme si rien ne s'était passé. Cela est particulièrement utile si vous êtes sur une mauvaise connexion Internet: il affiche un retour instantané si vos frappes de touches n'atteignent pas le serveur et tente continuellement de rétablir la connexion.

L'installation et la configuration sont simples: il est maintenant inclus dans toutes les distributions Linux actuelles (plus quelques non-Linux) et coordonne l'initialisation et l'authentification de la session via une connexion SSH antérieure. Donc, si vous êtes en mesure de vous connecter via ssh user@servervous, il est très probable que vous pourrez vous connecter avec mosh simplement en appelant mosh user@server, si les packages mosh sont installés aux deux extrémités.

La principale raison des échecs de connexion est que vous devez atteindre le serveur sur un port UDP (plage par défaut: 60000-61000) pour que mosh fonctionne. Donc, si le serveur est derrière un pare-feu, vous n’aurez généralement pas de chance si vous ne pouvez pas vous tromper vous-même ( conséquences pour la sécurité ).

Perséides
la source
3

Si vous souhaitez avoir une période de connexion plus longue, ajoutez dans le client:

echo 'ServerAliveInterval 30' | sudo tee -a ~/.ssh/config
echo 'ServerAliveCountMax 1200' | sudo tee -a ~/.ssh/config

ServerAliveCountMaxPar défaut, il est défini sur 3. Par conséquent, une fois que le groupe ServerAliveIntervala envoyé 3 petits paquets d'informations à votre serveur, il se déconnecte automatiquement. Le régler à 1200 signifie que ce processus devra être exécuté au moins 1200 fois. En bref, vous devez être connecté au moins 30 * 1200 secondes (10 heures).

Francisco Costa
la source
5
Pourquoi utiliser sudo pour un fichier qui appartient à l'utilisateur actuel ou qui n'existe pas encore?
Hubert Grzeskowiak
2

Cela signifie généralement que votre connexion réseau (TCP) a été réinitialisée. Par exemple, votre fournisseur d'accès Internet vous a reconnecté ou quelque chose comme ça.

maxschlepzig
la source
1

J'ai eu le même problème mais ce n'est pas comme prévu. Si vous constatez que, sur le même réseau, un autre serveur tente d'obtenir la même adresse IP, vous rencontrerez le même problème. Pour résoudre ce problème, vous devez vérifier si d'autres serveurs utilisent votre même adresse IP. Cela peut être fait en utilisant la arpcommande.

J'utilise Debian, voici donc un exemple des commandes que j'utilise pour déterminer si un autre serveur utilisait effectivement la même adresse IP.

apt-get install arp-scan
arp-scan -I eth0 -l | grep 192.168.1.42
  192.168.1.42 d4:eb:9a:f2:11:a1 (Unknown)
  192.168.1.42 f4:23:a4:38:b5:76 (Unknown) (DUP: 2)

Vous remarquerez que deux ensembles d’adresses MAC utilisent la même adresse IP. Évitez les conflits en définissant l'une sur une autre adresse IP.

Bill Ang
la source
0

Une autre cause du "message de tuyau cassé" est qu'une autre machine tente d'utiliser la même adresse IP que votre hôte.

Un moyen simple de tester si quelqu'un d'autre utilise cette adresse IP:

  1. Éteignez votre hôte
  2. ping la même adresse IP pour voir si une autre machine utilise cette adresse IP

Pour savoir quelles machines se trouvent sur votre réseau, vous pouvez utiliser le titre de cette question Unix et Linux: Comment trouver quelles autres machines sont connectées au réseau local .

Josir
la source