web-dev-qa-db-fra.com

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

Je sors souvent dans ma boîte à la maison après l’école, mais généralement lorsque je change de classe et que mon ordinateur est suspendu, le tuyau est cassé. Cependant, ssh se bloque simplement - Ctrl+cCtrl+z et Ctrl+d n'a aucun effet.

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

Ma question est donc la suivante: existe-t-il un moyen simple de faire en sorte que ssh meure correctement (c’est-à-dire que, si le tuyau échoue "normalement", il se termine par un message signalant un tuyau cassé)? Ou dois-je comprendre ce qu'est le PID et le tuer manuellement?

366
Wayne Werner

Les clés normales sont transférées via la session sshname__; aucune de celles-ci ne fonctionnera. Utilisez plutôt les séquences d'échappement. Pour tuer la session en cours a frappé par la suite Enter ↵~..

Plusieurs de ces séquences d'échappement peuvent être listées avec Enter ↵~?:

Supported escape sequences:
  ~.  - terminate session
  ~B  - send a BREAK to the remote system
  ~R  - Request rekey (SSH protocol 2 only)
  ~#  - list forwarded connections
  ~?  - 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 d'échappement en appuyant sur enter.

Notez que parce que frapper ~~ force sshà envoyer le ~ au lieu de l'intercepter, vous pouvez vous adresser à N imbriqué sshconnexions en appuyant sur ~ N fois. (Ceci ne s'applique qu'aux ~s qui suivent directement un enter.) C'est à dire que enter~~~~~. termine une session sshde 5 couches en profondeur et conserve les 4 autres intactes.

511
geekosaur

Vous voudrez peut-être également configurer au niveau de l'application des connexions persistantes pour que SSH: empêche qu'il ne gèle pas en cas de problème de connexion. Mon ~/.ssh/config contient ceci:

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

Cela permet au client ssh d'envoyer des alarmes au niveau de l'application toutes les 15 secondes. Chaque fois que trois d'entre eux échouent consécutivement (la valeur par défaut de ServerAliveCountMax), le client considère la connexion comme bloquée et la ferme.

Contrairement à l’option TCPKeepAlive, elle est vérifiée dans le canal crypté et n’est pas spoofable.


Il est à noter que ces entretiens permettent également, euh, de garder les connexions de longues périodes d'inactivité en vie, c'est-à-dire de vous empêcher d'avoir à moitié fermé des sessions TCP suspendues pendant des heures sans être touchées .

Je vous recommande vivement d'activer cette fonctionnalité si vous rencontrez ce problème régulièrement, mais vous devez également connaître le léger risque de sécurité que cela peut imposer. Une attaque en texte connu conn pourrait devenir plus facile si l’attaquant connaissait l’intervalle et le contenu d’une connexion inactive. Cela pourrait être la raison pour laquelle il n'est pas activé par défaut.

53
ulidtko

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

La liste complète des séquences d'échappement et de ce qu'elles font peut être affichée 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.)
39
scottl