Eingefrorene SSH-Sitzung beenden: Escape-Sequenzen

Drücken Sie Enter, dann ~, dann ., um eine eingefrorene SSH-Sitzung zu schließen. Ihr lokales ssh verarbeitet diese Tasten, es funktioniert also auch, wenn der Server nicht mehr antwortet. Das Enter ist wichtig, denn das Escape-Zeichen wird nur direkt nach einer neuen Zeile erkannt. ssh endet dann mit dem Code 255.

Nie wieder ~. tippen? In Wardterm kommt eine abgebrochene Sitzung von selbst zurück. Zeigen

Aktualisiert am . OpenSSH 10.3 unter macOS zu OpenSSH 10.0 unter Debian 13 in einem Wegwerf-Container, mit Tasten, die aus einem Skript durch ein Terminal gesendet wurden.

Eine eingefrorene Sitzung schließen

Enter  ~  .

Sie sehen:

Connection to server closed.

Wir haben den Server angehalten, sodass er nichts mehr beantwortete, und dann ~. direkt nach anderem Text getippt. Es passierte nichts. Nach Enter schloss ~. die Sitzung sofort. Scheint es nichts zu tun, drücken Sie Enter und versuchen Sie es erneut.

Mit Multiplexing schließt ~. in einer Sitzung, die die Verbindung mitbenutzt, nur diese Sitzung. In der Sitzung, die die Verbindung geöffnet hat, ohne ControlPersist, beendet es alle Sitzungen, die sie teilen.

Wenn die Sitzung endet, enden auch die Programme darin. Eine Shell in tmux läuft auf dem Server weiter: siehe SSH-Sitzung nach dem Trennen mit tmux am Leben halten.

Alle Escape-Sequenzen

Tippen Sie ~? nach einer neuen Zeile, und Ihr ssh gibt diese Liste aus. Alle brauchen zuerst eine neue Zeile, und sie werden nicht an den Server gesendet.

TastenWas sie tun
~.Schließt die Verbindung
~^ZHält ssh an, wobei ^Z Strg+Z bedeutet. Zurück mit fg
~#Listet offene Kanäle und Weiterleitungen auf
~&Schickt ssh in den Hintergrund, wenn es beim Abmelden auf das Ende von Weiterleitungen wartet
~?Zeigt die Liste
~CÖffnet eine kleine Kommandozeile, falls aktiviert
~BSendet ein BREAK
~IZeigt Verbindungsinformationen, in Versionen nach 10.0
~RFordert einen neuen Sitzungsschlüssel an
~V und ~vVerringern und erhöhen die Ausführlichkeit des Logs
~~Sendet ein einzelnes ~

Anhalten mit ~^Z

~^Z [suspend ssh]
[1]+  Stopped                 ssh server
$ fg

Das bringt Sie zurück zu Ihrer lokalen Shell, ohne die Sitzung zu schließen. Nach fg lief die Sitzung in unserem Test normal weiter.

~C: eine Weiterleitung zu einer offenen Sitzung hinzufügen

Seit OpenSSH 9.2 ist das standardmäßig aus, und ~C gibt commandline disabled aus. So schalten Sie es ein:

ssh -o EnableEscapeCommandline=yes server

Oder setzen Sie EnableEscapeCommandline yes in ~/.ssh/config. Dann öffnet ~C einen ssh>-Prompt:

ssh> -L 8022:localhost:22
Forwarding port.
ssh> -KL8022
Canceled forwarding.

Tippen Sie an diesem Prompt ? für die Befehle. Er akzeptiert auch -R und -D. Wir haben bestätigt, dass der Port nach -L geöffnet und nach -KL geschlossen wurde.

Was -L, -R und -D tun, erklärt SSH-Tunnel erklärt: lokal, remote und dynamisch.

Verschachtelte Sitzungen

Wenn Sie von einem Server per SSH zu einem anderen gehen, sieht das äußerste ssh das Escape zuerst. Jedes zusätzliche ~ reicht es eine Ebene weiter nach unten:

TastenSchließt
~.Die erste Verbindung, wodurch auch die innere endet
~~.Die zweite Verbindung, Sie bleiben auf dem ersten Server
~~~.Die dritte Verbindung, nach derselben Regel

Wir haben die ersten beiden getestet. ~~. gab Connection to localhost closed. aus und ließ die äußere Sitzung weiterarbeiten.

Das Escape-Zeichen ändern oder abschalten

Wählen Sie ein anderes Zeichen, wenn ~ auf Ihrer Tastatur umständlich ist:

ssh -e '^' server

Jetzt schließt ^. die Sitzung, und ~. ist gewöhnlicher Text. Um Escapes abzuschalten, zum Beispiel wenn Binärdaten durch die Sitzung laufen:

ssh -e none server

In ~/.ssh/config lautet die Option:

Host server
  EscapeChar none

Mit none lässt sich die Sitzung bei einem Einfrieren nicht mehr über die Tastatur schließen. Setzen Sie ServerAliveInterval, damit eine tote Verbindung von selbst endet. Siehe Broken pipe und Keepalive.

Fragen

Warum friert meine SSH-Sitzung ein?

Meist ist das Netz weggebrochen, während die Sitzung ruhig war, und ssh wartet noch auf einen Server, den es nicht mehr erreicht. Schließen Sie sie mit Enter, ~, . und setzen Sie ServerAliveInterval 30 in ~/.ssh/config: Dann bemerkt ssh eine tote Verbindung und beendet sich nach etwa anderthalb Minuten von selbst.

Warum schließt ~. meine SSH-Sitzung nicht?

Das Escape-Zeichen wirkt nur direkt nach einem Zeilenumbruch, drücken Sie also zuerst Enter. Es wirkt auch nicht, wenn EscapeChar auf none steht, wenn -e ein anderes Zeichen gewählt hat oder in einer Sitzung ohne Terminal.

Wie tippe ich ein ~ am Zeilenanfang in SSH?

Tippen Sie es zweimal. ~~ sendet ein einzelnes ~ an den Server.

Wofür ist ~C in SSH?

Es öffnet eine ssh>-Eingabe, in der Sie Portweiterleitungen in einer laufenden Sitzung hinzufügen oder beenden. Seit OpenSSH 9.2 ist es aus, bis Sie EnableEscapeCommandline yes setzen.

Quellen

Mehr zu Sitzungen und tmux

Alle Anleitungen