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

380

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+ c, Ctrl+ zet Ctrl+ dn'ont 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.-à-d. Lorsque le tuyau échoue "normalement", il se termine par un message concernant un tuyau cassé)? Ou dois-je comprendre ce qu'est le PID et le tuer manuellement?

Wayne Werner
la source
Si je suis déconnecté avec une session SSH active, cela se fige. Je viens de le tuer et commencer une nouvelle session. Aucune information n'est perdue parce que j'utilise GNU screen.
Lekensteyn
Moi aussi - l'écran est le meilleur. Mais il est toujours agaçant de devoir screen -x: P
Wayne Werner
[mosh] (mosh.mit.edu) est une alternative intéressante pour éviter ce problème. Il "reste connecté" même avec une connectivité Internet intermittente.
jaynp
@jaynp L'inconvénient de mon utilisation de mosh (depuis deux minutes) est que je ne sais pas comment le déconnecter. J'utilise une session tmux + irssi sur un hôte distant (en tant que videur IRC, en quelque sorte) et je souhaite parfois me déconnecter (tout en maintenant Tmux + irssi en marche), ce que j'ai fait avec <enter> + ~ +. en utilisant SSH mais ne fonctionnera pas en utilisant mosh.
Pavel Šimerda le

Réponses:

535

Les clés normales sont transférées au cours de la sshsession, aucune d'entre elles ne fonctionnera. Utilisez plutôt les séquences d'échappement. Pour tuer la session en cours frappé par la suite Enter ↵, ~, ..

Plus de ces séquences d'échappement peuvent être listés 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 ~~provoque l' sshenvoi au ~lieu de l'intercepter, vous pouvez adresser Nssh connexions imbriquées en frappant ~ N fois. (Ceci s'applique uniquement aux ~s qui suivent directement un enter.) C'est-à-dire qu'une session est enter~~~~~.terminée ssh5 couches profondes et que les 4 autres restent intactes.

geekosaur
la source
48
Pour les dispositions de clavier où ~est une touche morte , la séquence de touches est Enter ~ Space ..
Søren Løvborg
1
J'ai ajouté plus de séquences d'échappement qui pourraient être utiles. :)
Gertvdijk
5
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
6
@Hitechcomputergeek Enter ~ ~ .Puisque ~ ~envoie un littéral ~via votre session SSH, la deuxième session SSH le recevra sous la forme d'un tilde unique et interprétera le .comme faisant partie de l'échappement. Pour envoyer à la 5ème session SSH imbriquée, utilisez simplement 5 tildes dans votre séquence d'échappement.
Score_Under
4
la vie change;)
artm
54

Vous voudrez peut-être également configurer des connexions persistantes au niveau de l’application pour SSH afin de l’ empêcher de geler lors de problèmes de connexion. Mon ~/.ssh/configcontient 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 que la connexion est bloquée et la ferme.

Opposé à l'autre option TCPKeepAlive, ceci est vérifié dans le canal crypté et n'est pas spoofable.


Il est à noter que ces entretiens aident également, euh, à maintenir en vie les connexions qui ne fonctionnent plus, c'est-à-dire à vous empêcher d'avoir des sessions à moitié fermées suspendues pendant des heures sans aucune modification .

Je vous recommande fortement 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 peut devenir plus facile si l’attaquant connaît l’intervalle et le contenu d’une connexion inactive. Cela pourrait être la raison pour laquelle il n'est pas activé par défaut.

Ulidtko
la source
3
Raisons de sécurité. Vous pouvez aller boire un verre et laisser ssh sessio ouvert 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 buviez pendant votre pause de 10 minutes.
Luis Alvarado
2
@ CYREX, hein? Et comment l’option désactivée par défaut peut-elle vous empêcher d’avoir des partenaires de laboratoire injustes? %)
Ulidtko
1
@ulidtko: Y a-t-il une raison quelconque de ne pas définir le paramètre ServerAliveIntervalsur 1 afin qu'une connexion perdue soit immédiatement détectée?
krlmlr
2
@ gertvdijk: merci. Pour moi, cela fonctionne même sans Hostligne. En outre, "les chiffrements modernes tels que Advanced Encryption Standard ne sont actuellement pas sensibles aux attaques par du texte clair connu". (d'après le lien que vous avez ajouté) ... ...
krlmlr
2
vous pouvez également remplacer SSH avec Mosh (shell mobile). Mosh se connecte au serveur via SSH, mais établit ensuite un canal basé sur UDP qui résiste aux problèmes de connexion. Mosh a également un écho local pour que vous puissiez voir ce que vous tapez, même si le serveur ne répond pas. Lorsque les touches sont livrées, Mosh marque le texte en écho. mosh.mit.edu
Pascal Rosin
41

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.)
scottl
la source
Comment fermer la liste des séquences d'échappement?
Kristianp
3
Après l’impression de la liste des séquences d’échappement, vous n’êtes pas prêt à accepter la suivante.
Tejas Kale