Gardez la session SSH en vie [fermé]

242

J'utilise ssh -p8520 username@remote_hostpour me connecter au serveur distant.

Problème :

Il est toujours connecté et fonctionne correctement lorsque je suis sur le lieu de travail. Malheureusement, le terminal se bloque en 10 à 15 minutes après ma connexion au serveur distant depuis mon domicile.

Il n'y a pas de rapport d'erreur / timeout sur la console mais le curseur ne peut plus bouger.

Lorsque vous entrez wpour vérifier les utilisateurs de connexion, certains utilisateurs de connexion zombies sont là et je dois les tuer manuellement.

C'est assez ennuyeux. Quelqu'un peut-il m'aider?

Haifeng Zhang
la source
J'ai aussi eu ça, j'ai commencé à l'utiliser screen. C'est peut-être une sorte de problème de délai d'attente.
martin
@martin screenaide à maintenir le programme en marche. Malheureusement, je dois parfois travailler sur le serveur distant :(
Haifeng Zhang
Si vous le démarrez sans paramètres, cela vous donne un shell.
martin
Est-ce que tu dis screenseulement? Il peut résoudre le problème de connexion perdue? Non screen -S screenName? J'utilise toujours l'écran avec -Set-r
Haifeng Zhang
1
Non, cela ne résout pas le problème, vous évitez seulement de perdre votre travail dans le terminal. Si vous ne faites rien, il gèlera toujours, vous pouvez simplement reprendre là où vous avez commencé. Je voulais dire que vous pouvez créer un terminal que vous pouvez toujours reprendre en utilisant screen. Vous semblez déjà le savoir;)
martin

Réponses:

451

Le démon ssh (sshd), qui s'exécute côté serveur, ferme la connexion côté serveur si le client devient silencieux (c'est-à-dire qu'il n'envoie pas d'informations). Pour éviter toute perte de connexion, demandez au client ssh d'envoyer un signal de signe de vie au serveur de temps en temps.

La configuration pour cela est dans le fichier $HOME/.ssh/config, créez le fichier s'il n'existe pas (le fichier de configuration ne doit pas être lisible par le monde, donc exécutez-le chmod 600 ~/.ssh/configaprès avoir créé le fichier). Pour envoyer le signal toutes les quatre minutes (240 secondes, par exemple) à l'hôte distant, placez ce qui suit dans ce fichier de configuration:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Pour activer l'envoi d'un signal continu pour tous les hôtes, placez le contenu suivant dans le fichier de configuration:

Host *
    ServerAliveInterval 240
rockymonkey555
la source
24
@ user271996, pourquoi devrait-on redémarrer un démon pour un paramètre côté client?
maxschlepzig
La configuration ne doit être accessible qu'en écriture. la lisibilité n'est pas une préoccupation. L'utilisation de 600 comme niveau d'autorisation est correcte, car elle n'est accessible qu'en écriture.
jbruni
1
juste au cas où ce n'est pas évident, ce fichier de configuration est sur votre PC / Linux
zzapper
5
Je suis toujours confus au sujet du nom de la configuration: le client utilise ServerAliveInterval tandis que le serveur utilise ClientAliveInterval . Quel bordel.
youkaichao
@youkaichao Il y a souvent cette confusion. En tant que concepteur d'API, il y a des raisons pour lesquelles je pourrais le dire des deux manières. En fin de compte, ce qui est le plus critique, c'est une bonne documentation de la norme choisie.
Cameron Tacklind
171

Je voulais une solution unique:

ssh -o ServerAliveInterval=60 [email protected]

Stocké dans un alias:

alias sshprod='ssh -v -o ServerAliveInterval=60 [email protected]'

Vous pouvez maintenant vous connecter comme ceci:

me@MyMachine:~$ sshprod
Ryan
la source
12
C'est cool, mais pas exactement une "solution unique". Si vous allez vous connecter au serveur plus d'une fois, pourquoi ne pas faire Host *& ServerAliveInterval 240(ou spécifier le nom d'hôte, si vous le souhaitez uniquement [email protected]comme dans la réponse de rockymonkey555? La définition d'un alias ne semble en aucun cas plus facile.
Lambart
8
Ou, créez simplement un alias dans votre ~ / .bashrc:alias ssh='ssh -o ServerAliveInterval=60'
Jabba
15
Il veut dire "une fois" comme dans "ça ne marche qu'une fois", pas "je n'ai qu'à l'écrire une fois".
Jonathan Hartley
1
Oui, si vous lisez "une fois" comme "à usage unique", cela fait parfaitement l'affaire.
philraj
Si vous voulez un "one-liner" qui se règle ServerAliveIntervalsur 60, super. Cependant, utiliser un alias bash alors que vous pourriez l'utiliser .ssh/configest tout simplement stupide.
Cameron Tacklind
50

Pour ceux qui se demandent, @ edward-coast

Si vous souhaitez définir la conservation du serveur , ajoutez ceci à /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : définit un délai d'expiration en secondes, après quoi, si aucune donnée n'a été reçue du client, sshd (8) enverra un message via le canal crypté pour demander une réponse au client.

ClientAliveCountMax : définit le nombre de messages vivants du client (voir ci-dessous) qui peuvent être envoyés sans que sshd (8) ne reçoive de message du client. Si ce seuil est atteint pendant l'envoi des messages du client vivant, sshd déconnectera le client, mettant fin à la session.

Jeff Davenport
la source
Il semble qu'il n'y ait pas de "paramètre" tel que ClientAliveInterval, seulement ServerAliveInterval, vous pouvez vérifier dans la page de manuel "man ssh_config"
dtj
6
Ce n'est pas le bon, recherchez dans "man sshd_config" la partie serveur exécutant le démon ssh, pas la configuration client.
Jeff Davenport
Dois-je utiliser ClientAliveIntervalpour laisser le serveur vérifier le client vivant, ou dois-je laisser le client "cingler" le serveur à ServerAliveIntervalplusieurs reprises? Les deux ne semblent pas avoir de sens
qrtLs
1
Ne définissez le ClientAliveIntervalsur le serveur que si vous souhaitez que le serveur se déconnecte sur les connexions mortes qui ne répondent pas, et vous pouvez personnaliser la fréquence et le moment où cela se produit.
Jeff Davenport
20

paramètres de mastic

Les utilisateurs de FYI Putty peuvent définir les options ici

Ruben Benjamin
la source
10

Nous pouvons garder notre connexion ssh en vie en ayant les configurations globales suivantes

Ajoutez la ligne suivante au /etc/ssh/ssh_configfichier:

ServerAliveInterval 60
minhas23
la source
Cela fonctionne-t-il uniquement pour le client ou cela fonctionne-t-il également pour sshd?
Côte Edward
1
@EdwardCoast Il fonctionne sur la machine cliente. Je l'ai testé sur Mac
minhas23