Comment puis-je empêcher une session SSH de rester suspendue dans un terminal OS X?

101

Lorsque je ferme mon MacBook avec une session SSH active dans Terminal puis que je le réveille, l'invite ne répond plus.

Dans environ cinq minutes, il est dit

Write failed: Broken pipe

et se termine.

Cela se produit également lorsque je ne tape rien dans le terminal en quinze minutes environ.

Puis-je forcer OS X à:

  1. Maintenir la connexion SSH en vie le plus longtemps possible
  2. Tuez-le immédiatement une fois qu'il devient insensible

?

Dan
la source

Réponses:

121

Pour maintenir la connexion active , vous pouvez vérifier dans /etc/ssh/ssh_configla ligne où il est indiqué ServerAliveInterval, qui vous indique à quelle fréquence (en secondes) votre ordinateur va envoyer un paquet nul pour maintenir la connexion active. Si vous avez un 0 qui indique que votre ordinateur n'essaie pas de maintenir la connexion active (il est désactivé), sinon, il vous indique à quelle fréquence (en secondes) il envoie le paquet susmentionné. Essayez de mettre en 120 ou 240, si cela tue encore votre connexion, vous pouvez aller plus bas, peut-être à 5, si avec ce nombre cela ne se produit pas, c'est peut-être votre routeur qui décharge la connexion pour libérer de la mémoire.

Pour le tuer quand il est raccroché , vous pouvez utiliser le caractère d'échappement ssh:

~.

Autrement dit, appuyez sur le tilde, puis sur le point; si cela ne fonctionne pas, appuyez sur Entrée avant d'appuyer sur cette touche, la connexion sera immédiatement supprimée.

Jorge Núñez
la source
3
Ok, vous pouvez tuer la connexion avec un ~.bon conseil! Mais que fait-il réellement?
CousinCocaine
La seule chose qui me laissait perplexe était de savoir si je devais ou non redémarrer sshd, mais il me semble que le fait de sortir de la session et de se reconnecter a fait l'affaire
dgig
Souvent le ~. ne fonctionne pas pour moi pendant plusieurs minutes. Pourquoi donc?
Sridhar Sarnobat
2
L'emplacement de ssh_configest /etc/ssh/ssh_configsur Mac OS X. Je modifierais la réponse moi-même, mais je n'ai pas assez de représentants sur ce site pour le faire.
Erik B
dois-je mettre cela dans le client ou le serveur? Je pense client, mais peut être plus clair.
EralpB
23

Vous pouvez:

Configurez votre système, pour l’ensemble du système, pour toutes les connexions. En modifiant: / etc / ssh / ssh_config , ajoutez la ligne suivante:

ServerAliveInterval 10

Ou, par serveur ~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

Qu'est-ce que cela envoie-t-il en masse, toutes les 10 secondes ...

Aleksandar Pavić
la source
9

Vous pouvez également essayer d'utiliser le projet génial Mosh . Il gérera gracieusement les pertes réseau, les machines en veille, etc. et restaurera la connexion lorsque vous aurez à nouveau un réseau opérationnel.

Une autre solution plus respectée consiste à utiliser tmux sur la machine distante. Dans ce cas, vous pouvez toujours avoir un tuyau cassé, mais si vous reconnectez votre shell et vos applications attendront comme vous les avez laissées.

BinaryPaean
la source
En fait, c'est exactement ce que je fais maintenant.
Dan
5

Les différentes réponses ici sont en conflit en ce qui concerne le chemin exact des fichiers de configuration. Peut-être que c'est différent dans différents Unix? Je suggère de lire les pages de manuel de votre système!

Dans man ssh (1) , recherchez le texte: config . Sur mon système, j'ai le choix entre des fichiers de configuration système ou ceux de cet utilisateur (et les chemins sont étrangement différents).

Dans man ssh_config (5) , recherchez le texte: alive . Sur mon système, il semble que je doive définir ServerAliveInterval et ServerAliveCountMax .

Ce qui a fonctionné pour moi, sur macOS 10.12 Sierra, est de mettre les deux lignes suivantes dans ~ / .ssh / config:

ServerAliveInterval 20
ServerAliveCountMax 180

Maintenant, je peux ssh sur mon serveur Ubuntu 16.04 sans déconnexion pendant 20 * 180 secondes = 1 heure. Fait ma journée!

Jerry Krinock
la source
3

Reconnecter automatiquement ssh après une interruption de sommeil ou une connexion wifi

  1. Installez autossh depuis MacPorts ou Homebrew:brew install autossh

  2. Ouvrir le terminal et courir autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. Déconnectez votre wifi ou mettez votre Mac en veille.

  4. Lorsque vous vous reconnectez au wifi, la session ssh se reconnectera automatiquement.


Ssh automatiquement après la connexion

Jon Stacey a écrit un article sur l’activation automatique d’une session SSH lorsque vous vous connectez.

  1. Installez autossh depuis MacPorts ou Homebrew:brew install autossh

  2. Créez un flux de travail Automator avec un script bash.

Script shell Automator

  1. Accédez aux éléments de connexion dans les préférences système .

Préférences Système> Éléments de connexion

  1. Ajoutez votre flux de travail Automator aux éléments de connexion .

Éléments de connexion

Kamil Slowikowski
la source
1

Ajoutez ces deux lignes à /etc/ssh/ssh_config:

ServerAliveInterval 60
TCPKeepAlive yes
MOHRE
la source
1

Vient de résoudre ce problème, ajoutez les lignes suivantes dans $HOME/.ssh/config.

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

Paramètre TCPKeepAlive noindique au client de simplement supposer que la connexion est toujours valide jusqu'à preuve du contraire, à la demande de l'utilisateur, ce qui signifie que des ruptures de connexion temporaires lorsque votre terme ssh est inactif en arrière-plan ne tueront pas la connexion.

Nur Rony
la source