le terminal se bloque lorsque la connexion est perdue et que ssh est activé

18

lorsque je ssh vers un serveur sur Internet dans un onglet de terminal gnome, si j'ai perdu la connexion Internet, l'onglet du terminal sera bloqué et n'acceptera aucune entrée. Pourquoi est-ce accroché?

Existe-t-il un moyen d'activer l'onglet du terminal, c'est-à-dire de le faire continuer à exécuter le processus shell local?

La fermeture de l'onglet du terminal est-elle le seul moyen?

StackExchange pour tous
la source

Réponses:

20

Connexion SSH descend automatiquement après un laps de temps défini par ClientAliveIntervalet les ClientAliveCountMaxparamètres et leurs équivalents côté client. Si ces délais d'attente sont assez élevés, vous rencontrerez un shell gelé. Cependant, si vous utilisez, OpenSSHvous n'avez pas à attendre un délai d'attente et pouvez forcer la fermeture d'une connexion à l'aide de caractères d'échappement :

ESCAPE CHARACTERS
When a pseudo-terminal has been requested, ssh supports a number
of functions through the use of an escape character.  A single
tilde character can be sent as ~~ or by following the tilde by a
character other than those described below. The escape character
must always follow a newline to be interpreted as special. The
escape character can be changed in configuration files using the
EscapeChar configuration directive or on the command line by the
-e option.
The supported escapes (assuming the default ‘~’) are:

~.
    Disconnect.
(...)

Lorsque la connexion se bloque, appuyez sur ~(cela signifie Shift+ `touches ensemble), relâchez-la et appuyez sur .. Alternativement, si vous travaillez avec une connexion instable ou devez être connecté au serveur distant tout le temps, vous pouvez utiliser autossh pour renouveler automatiquement la connexion perdue, c'est très pratique.

MODIFIER :

Cependant, si les deux ClientAliveIntervalet ServerAliveIntervalsont définis explicitement sur 0 ou ne sont pas définis explicitement et sont ensuite définis sur 0 par défaut selon sshd_configet ssh_configpages de manuel, les paramètres de délai d'attente sont définis dans les fichiers suivants (à partir de http://tldp.org/HOWTO/TCP- Keepalive-HOWTO / usingkeepalive.html ):

  # cat /proc/sys/net/ipv4/tcp_keepalive_time
  7200

  # cat /proc/sys/net/ipv4/tcp_keepalive_intvl
  75

  # cat /proc/sys/net/ipv4/tcp_keepalive_probes
  9

  The first two parameters are expressed in seconds, and the last is
  the pure number. This means that the keepalive routines wait for
  two hours (7200 secs) before sending the first keepalive probe,
  and then resend it every 75 seconds. If no ACK response is
  received for nine consecutive times, the connection is marked as
  broken.

Vous pouvez modifier ces 3 fichiers simplement en utilisant echoet voyez par vous-même qu'une session SSH gelée est déconnectée en fonction de ces valeurs.

Arkadiusz Drabczyk
la source
6
Je voudrais ajouter que ssh ne reconnaît que son caractère d'échappement initialement ou après une entrée. Lorsqu'une connexion ssh est bloquée, Entrée est souvent mais pas toujours le dernier caractère sur lequel vous avez appuyé précédemment. Il est donc probablement préférable de s'y habituer Enter ~ .comme la séquence qui met fin à la connexion.
egmont
Merci. Je ne sais toujours pas comment les /proc/sys/net/ipv4/tcp_keepalive*fichiers et ClientAliveIntervalet ServerAliveInterval travailler ensemble? Sont-ils tous pour les mêmes paramètres, c'est-à-dire pour maintenir la connexion ssh en vie? Les anciens fichiers ne sont-ils pas uniquement destinés aux connexions ssh mais également à d'autres connexions TCP?
StackExchange for All du
Une autre question: pourquoi "Si ces délais d'attente sont assez élevés, vous rencontrerez un shell gelé." Qu'entendez-vous par «les délais d'attente sont assez élevés»? Le shell n'est-il pas toujours figé, si manque d'activité pendant la durée spécifiée? ou voulez-vous dire dans certains cas de manque d'activité, le shell n'est pas gelé mais sort automatiquement?
StackExchange for All du
@Tim: 1. /proc/sys/net/ipv4/tcp_keepalive*ne sont pas seulement pour ssh(d)mais comme il est dit dans le document que j'ai lié à:Remember that keepalive support, even if configured in the kernel, is not the default behavior in Linux. Programs must request keepalive control for their sockets using the setsockopt interface. There are relatively few programs implementing keepalive, but you can easily add keepalive support for most of them following the instructions explained later in this document.
Arkadiusz Drabczyk
@Tim: 2. Assez élevé signifie 2 heures par exemple - vous devrez attendre 2 heures avant de déconnecter la session. Faites un test - connectez-vous avec un hôte distant, tuez sshdsur la télécommande ou retirez un câble et vérifiez quand une session gelée se ssh terminera d'elle-même. frozen shellJ'entends par là un shell qui est inactif, ne prend aucune clé et n'imprime rien.
Arkadiusz Drabczyk du