Manière d'éviter le délai de connexion ssh et le gel du terminal GNOME

235

Lorsque je me connecte via ssh à certains serveurs, il expire et "gèle" le terminal (n'accepte pas les entrées, ne se déconnecte pas, ne peut pas utiliser Ctrl-C pour tuer le processus ssh ou quoi que ce soit).

Ceci est dans Ubuntu gnome-terminalbien que cela semble mettre en pause l'entrée / la sortie du terminal, et n'affecte pas le fonctionnement du logiciel du terminal GNOME lui-même. Donc, moins un bug avec gnome-terminalune incohérence ennuyeuse avec ssh.

Alors, y a-t-il un moyen d'empêcher / de regagner le terminal des connexions ssh qui ont expiré?

Kzqai
la source

Réponses:

256

sshd (le serveur) ferme la connexion s'il n'entend plus rien du client. Vous pouvez demander à votre client d’envoyer de temps en temps un signal de signe de vie au serveur.

La configuration pour cela est dans le fichier ~/.ssh/config. Pour envoyer le signal toutes les quatre minutes à remotehost, inscrivez ce qui suit dans votre ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

C'est ce que j'ai dans mes ~/.ssh/config.

Pour l'activer pour tous les hôtes, utilisez:

Host *
  ServerAliveInterval 240

Assurez-vous également de l'exécuter chmod 600 ~/.ssh/config, car le fichier de configuration ne doit pas être lisible par tout le monde.

Ludwig Weinzierl
la source
1
Merci sblair de m'aider avec la formulation, c'est très apprécié. J'ai changé "ne doit pas" revenir à "ne doit pas" car ssh vérifie les autorisations du fichier et s'il est lisible par tout le monde ou par un groupe, il échoue.
Ludwig Weinzierl
1
Ce n'est pas ce que le PO a demandé. Il ne se fait pas virer pour cause d'inactivité. Il tente de se connecter et son terminal est gelé.
Cerin
Où est - ce ~/.ssh/config?
Utilisateur
1
@User '~ /' représente votre dossier personnel. '.ssh' est un dossier de votre dossier personnel.
wkm
6
c'est inutile si votre connexion est en train d'être perdue ...
so12311
248

Appuyez sur Enter, ~, l' .un après l'autre pour se déconnecter d'une session historisée.

La section "ESCAPE CARACTERS" de la page de manuel ssh explique les détails sous-jacents.

Peter Eisentraut
la source
40
Cette réponse me semble répondre plus précisément à la question et, en tout cas, était la réponse que je cherchais.
CoatedMoose
Notez que vous devez supprimer la mise EscapeChar ~en commentaire de la ligne /etc/ssh/ssh_config(ou ~/.ssh/ssh_configsi vous préférez).
Aditya MP
@adityamenon Non, EscapeChar ~c'est déjà la valeur par défaut intégrée.
Peter Eisentraut
2
@Mark la question demande "existe-t-il un moyen d'empêcher le terminal de regagner des connexions ssh qui ont expiré ?" L'accent est à moi.
CoatedMoose
2
Même s’il était incorrect dans le contexte de la question, c’est exactement ce que je voulais.
Subin Sebastian
38

Même si ce n’est pas une réponse directe à votre question, elle est étroitement liée au problème que vous avez. Au lieu d'essayer de maintenir la connexion en vie (toutes les connexions finissent par mourir), vous pouvez utiliser des multiplexeurs de terminaux, comme par exemple screen, tmuxqui maintiennent la session en arrière-plan, même si votre terminal est déconnecté.

Essentiellement, lorsque vous vous connectez au serveur SSH, vous exécutez immédiatement screence qui va créer et attacher une nouvelle session:

$ screen

Ensuite, vous travaillez avec le shell comme vous le feriez normalement. Désormais, si la connexion est interrompue, lorsque vous pouvez vous reconnecter au serveur via SSH, vous obtenez une liste des sessions en cours avec:

$ screen -ls

Pour vous rattacher à une session:

$ screen -r <session>

<session>est le PID ou un nom de session. Vous serez reconnecté à votre session et vous pourrez continuer là où vous l'avez laissé!

Vous pouvez même déconnecter la session et vous reconnecter de chez vous pour reprendre le point exact où vous l'avez laissé. Pour détacher la session que vous utilisez C-asuivie de C-d(c'est Control + Apuis Control + D).

Il y a aussi un tutoriel en ligne simple .

L'utilisation de screenet tmuxsur des serveurs distants est considérée comme une pratique recommandée et est fortement recommandée . Certaines personnes vont même jusqu'à avoir screencomme shell de connexion par défaut. Ainsi, lorsqu'elles se connectent, elles commencent immédiatement une nouvelle screensession.

les photos
la source
2
une autre alternative est d'utiliser mosh: mosh.mit.edu
Zombies
Ceci est particulièrement utile si vous utilisez un point d'accès ou une connexion Wi-Fi qui se déconnecte parfois.
Randall
11

Essayez d’ajouter -o ServerAliveInterval=30à votre chaîne de connexion ( 30signifie 30 secondes et peut bien sûr être ajusté)

Fergie
la source
5

Vous pouvez également définir un délai d'inactivité du côté du serveur SSH:

Fichier: /etc/ssh/ssh_config

Contenu:

ClientAliveInterval XX
ClientAliveCountMax YY

Cela fonctionne exactement de la même manière que le paramètre client, mais les paquets nuls sont envoyés depuis le serveur plutôt que par le client.

Extrait de:

http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html

Ladinfremes
la source
1

Pour les personnes qui souhaitent empêcher le client d’arriver à la fin de sa vie.

Vous pouvez essayer de définir ConnectTimeout 0dans le fichier de configuration. La valeur 0 signifie que la connexion sera maintenue indéfiniment sauf si elle est fermée.

Votre fichier de configuration (ou ssh_config) pourrait ressembler à ceci:

Host *
   ConnectTimeout 0
Yohannes Libanos
la source