427 votes

Comment puis-je sortir de ssh quand il se bloque ?

Je me connecte fréquemment par ssh à ma boîte à la maison depuis l'école, mais généralement, lorsque je change de classe et que mon ordinateur est suspendu, le tuyau est rompu. Cependant, ssh se bloque tout simplement - Ctrl + c , Ctrl + z y Ctrl + d n'ont aucun effet.

C'est ennuyeux de devoir redémarrer mon terminal, et encore plus ennuyeux de devoir fermer et recréer une nouvelle fenêtre d'écran.

Ma question est donc la suivante : existe-t-il un moyen simple de faire mourir ssh correctement (c'est-à-dire que lorsque le tuyau échoue "normalement", il se termine avec un message indiquant que le tuyau est cassé) ? Ou dois-je trouver quel est le PID et le tuer manuellement ?

0 votes

Si je suis déconnecté avec une session SSH active, il se fige. Je l'arrête simplement et je démarre une nouvelle session. Aucune information n'est perdue car j'utilise GNU screen.

0 votes

Moi aussi - l'écran est le meilleur. Mais c'est quand même ennuyeux de devoir screen -x :P

0 votes

[mosh](mosh.mit.edu) est une alternative intéressante pour éviter ce problème. Elle "reste connectée" même avec une connectivité internet intermittente.

611voto

geekosaur Points 11087

Les clés normales sont transmises sur le ssh donc aucune d'entre elles ne fonctionnera. Utilisez plutôt les séquences d'échappement. Pour tuer la session en cours, tapez ensuite Enter , ~ , . .

(Gardez à l'esprit que dans les claviers internationaux où ~ est configuré pour être un caractère de composition, vous devez le frapper deux fois : Enter , ~ , ~ , . )

D'autres séquences d'échappement peuvent être listées avec Enter , ~ , ? :

Supported escape sequences:
     ~.   - terminate connection (and any multiplexed sessions)
     ~B   - send a BREAK to the remote system
     ~C   - open a command line
     ~R   - request rekey
     ~V/v - decrease/increase verbosity (LogLevel)
     ~^Z  - suspend ssh
     ~#   - list forwarded connections
     ~&   - background ssh (when waiting for connections to terminate)
     ~?   - this message
     ~~   - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

Vous pouvez fermer la liste des séquences Escape en appuyant sur la touche Enter .

Remarquez que parce que frapper ~~ causes ssh pour envoyer le ~ au lieu de l'intercepter, vous pouvez vous adresser à N emboîté ssh les connexions en appuyant sur ~ N temps. (Ceci ne s'applique qu'aux ~ qui suivent directement un Enter .) C'est-à-dire que Enter~~~~~. met fin à une ssh session 5 couches profondes et garde les 4 autres intactes.

48 votes

Pour les dispositions de clavier où ~ est un touche morte la séquence de touches est Enter ~ Space . .

1 votes

J'ai ajouté d'autres séquences d'échappement qui pourraient être utiles :)

5 votes

Notez que vous devez décommenter la ligne EscapeChar ~ en /etc/ssh/ssh_config (ou ~/.ssh/ssh_config si vous préférez).

62voto

ulidtko Points 5283

Il se peut que vous souhaitiez également mettre en place des keep-alives pour SSH à prévenir pour l'empêcher de se bloquer en cas de problèmes de connexion. Mon ~/.ssh/config contient ceci :

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

Cela fait que le client ssh envoie des keep-alives au niveau de l'application toutes les 15 secondes. Si trois d'entre elles échouent consécutivement (la valeur par défaut est de 1,5 million d'euros), le client ssh envoie un message d'alerte. ServerAliveCountMax ), le client considère la connexion comme suspendue et la ferme.

Opposé à l'autre option TCPKeepAlive Cette vérification est effectuée dans le cadre du canal crypté et ne peut être falsifiée.


Il est à noter que ces "keep-alives" aident aussi à, uhm, à garder long-idling connexions vivantes, c'est-à-dire qu'elles vous empêchent d'avoir semi-fermé des sessions tcp suspendues pendant des heures sans être modifiées.

Je vous recommande vivement d'activer cette fonction si vous rencontrez régulièrement ce problème, mais vous devez également savoir qu'elle peut présenter un léger risque pour la sécurité. A attaque par connaissance du texte pourrait devenir plus facile si l'attaquant connaît l'intervalle et le contenu d'une connexion inactive. C'est peut-être la raison pour laquelle il n'est pas activé par défaut.

3 votes

Pour des raisons de sécurité. Vous pourriez aller boire un verre et laisser la sessio ssh ouverte et votre partenaire de laboratoire avec qui vous avez travaillé au cours des 20 dernières années pourrait utiliser votre session pour détourner le serveur et le détruire... pendant que vous buvez pendant votre pause de 10 minutes.

2 votes

@CYREX, hein ? Et comment l'option désactivée par défaut peut-elle vous empêcher d'avoir des partenaires de laboratoire injustes ? %)

1 votes

@ulidtko : Y a-t-il une raison pour ne pas mettre ServerAliveInterval à 1 pour qu'une perte de connexion soit immédiatement détectée ?

47voto

scottl Points 2528

Comme indiqué dans la réponse de geekosaur, la séquence d'échappement ~. met fin à la connexion.

La liste complète des séquences d'échappement et leur fonction peuvent être affichées en tapant ~? :

Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

1 votes

Comment fermer la liste des séquences d'échappement ?

4 votes

Vous ne savez pas, après avoir imprimé la liste des séquences d'échappement, il est prêt à accepter la suivante.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X