SSH-Escape-Sequenzen-Handbuch: Gefrorene SSH-Sitzungen sofort beheben
Jeder Linux-Benutzer hat schon einmal eine eingefrorene SSH-Sitzung auf harte Weise beendet. Aber es gibt ein eingebautes Escape-Menü — ruhig in OpenSSH sitzend — das dies in weniger als einer Sekunde behebt. In diesem Tutorial werden wir alles lernen, was Sie über SSH-Escape-Sequenzen (oder -Zeichen) wissen müssen und wie und wann man sie verwendet.
Kurze Zusammenfassung
- Der OpenSSH-Client enthält Escape-Sequenzen (Zeichen). Dies sind spezielle Tastenkombinationen, die den lokalen SSH-Client steuern.
- Zum Beispiel, wenn SSH einfriert, drücken Sie
Enterund geben Sie dann~.ein, um Ihre Sitzung sofort zu schließen. Kein Beenden des Terminals erforderlich. - SSH-Escape-Sequenzen laufen vollständig auf Ihrer lokalen Maschine, nicht auf dem entfernten Server. Deshalb funktionieren sie selbst dann, wenn der Server abgestürzt ist oder das Netzwerk tot ist. Es ist ein paralleler Steuerkanal, der direkt in den Client integriert ist.
- Sie können den Tilde-Multiplikator für verschachtelte Sitzungen verwenden. Wenn Sie drei Hops tief sind (z.B. lokal → Bastion → Produktion), schließt das Tippen von
~~~.nur die innerste Sitzung, während die mittlere intakt bleibt. Jede Tilde entfernt genau eine Schicht. Die meisten Menschen erkennen nicht, dass SSH die gesamte Hop-Kette verfolgt und Escape-Befehle entsprechend weiterleitet. - Escape-Sequenzen funktionieren nur, wenn sie sofort nach dem Drücken von Enter eingegeben werden. Dies stellt sicher, dass der SSH-Client sie von normalen Befehlen unterscheiden kann.
Einführung
Stellen Sie sich das vor. Sie sind drei Ebenen tief in einem Produktionsserver. Ihre SSH-Sitzung friert ein. Der Cursor blinkt. Nichts bewegt sich. Also tun Sie, was jeder tut, d.h. Sie schließen das Terminalfenster zwangsweise, öffnen ein neues und stellen die Verbindung wieder her. Das Ganze dauert zwei Minuten und bricht Ihre Konzentration völlig.
Aber du musstest das nie tun. OpenSSH wird seit den frühen 2000er Jahren mit einem eingebauten Kontrollmenü oder Escape-Menü ausgeliefert. Es funktioniert sogar, wenn der entfernte Server völlig tot ist. Es dauert eine Sekunde, es zu benutzen. Und fast niemand weiß, dass es existiert.
Heute beheben wir das. Bis du diesen Artikel beendet hast, wirst du niemals wieder ein Terminalfenster wegen einer eingefrorenen SSH-Sitzung schließen.
Wichtiger Hinweis: OpenSSH wird seit den frühen 2000er Jahren mit einem eingebauten Escape-Menü ausgeliefert. Es funktioniert sogar, wenn der entfernte Server vollständig ausgefallen ist. Und fast niemand weiß, dass es existiert.
Was ist das SSH-Escape-Menü oder geheime Menü?
Der SSH-Client enthält Escape-Sequenzen (Zeichen). Dies sind spezielle Tastenkombinationen, die den lokalen SSH-Client steuern, nicht den entfernten Server.
Dieses integrierte Menü ermöglicht Ihnen:
- Eine eingefrorene SSH-Sitzung sofort beenden
- Portweiterleitung erstellen, während bereits verbunden
- Eine SSH-Sitzung in den Hintergrund legen
- Aktive SSH-Tunnel anzeigen
- SSH-Debugging-Ausgabe steuern
Kurz gesagt, es gibt Ihnen direkte Kontrolle über den SSH-Client, selbst wenn das entfernte System nicht mehr reagiert.
Normalerweise geht alles, was Sie in einer SSH-Sitzung eingeben, an die entfernte Maschine. Escape-Sequenzen unterbrechen jedoch diesen Ablauf. Der SSH-Client erfasst sie lokal, bevor irgendetwas an den Server gesendet wird.
Dieses Design ist wichtig, weil es Ihnen ermöglicht, SSH sogar wenn die Verbindung hängt zu steuern.
Wie Escape-Zeichen (Sequenzen) in SSH funktionieren
Bevor wir uns den Befehlen zuwenden, lassen Sie uns verstehen, was diese Sequenzen besonders macht.
Wie ich bereits zuvor erwähnt habe, geht Ihre Tastatureingabe beim SSH-Zugriff auf einen Server normalerweise direkt an die entfernte Maschine. Sie tippen, das entfernte System antwortet. Einfach.
Keyboard → SSH client → Remote serverAber SSH hat auch einen zweiten, parallelen Hörmodus. Ihr lokaler SSH-Client überwacht stillschweigend jede Tastenanschlag auf einen bestimmten Auslöser: ein Tilde-Zeichen (~), das direkt nach einem Zeilenumbruch eingegeben wird. Wenn er dieses Muster erkennt, fängt er die Eingabe ab und behandelt das nächste Zeichen als einen Befehl – einen, der Ihr Gerät niemals verlässt.
Aufgrund dieses Designs sind Escape-Sequenzen völlig unabhängig vom Remote-Server. Das entfernte System kann abstürzen, einfrieren oder nicht erreichbar sein – und diese Befehle funktionieren dennoch perfekt, weil Ihr lokaler SSH-Client sie vollständig eigenständig verarbeitet.
Die wichtige Regel: Escape-Sequenzen werden nur am Anfang einer neuen Zeile ausgelöst. Das bedeutet: Escape-Sequenzen funktionieren nur direkt nach dem Drücken der Enter-Taste. Sie sollten also immer zuerst die
Enter-Taste drücken und dann Ihre Sequenz eingeben. Wenn Sie sie mitten in einer Zeile eingeben, behandelt SSH sie als normalen Text und sendet sie an das entfernte System weiter.
Wie man das SSH-Escape-Menü öffnet
Um auf das Escape-Menü zuzugreifen, befolgen Sie jedes Mal diese drei Schritte:
- Drücken Sie
Enter, um den Cursor auf eine neue Zeile zu bewegen. - Geben Sie
~?ein (Tilde, dann Fragezeichen). Die Zeichen werden beim Tippen nicht angezeigt. - Die vollständige Liste der unterstützten Escape-Sequenzen erscheint sofort auf Ihrem Bildschirm.
So sieht das SSH-Geheimmenü aus:
ostechnix@fedora:~$ ~?
Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~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.)Diese Liste ist das SSH-Steuerungs- (oder Escape-)Menü.
Sie werden vielleicht feststellen, dass die Zeichen beim Tippen nicht erscheinen. Dies ist beabsichtigt. Der SSH-Client fängt Escape-Sequenzen lokal ab und verarbeitet sie selbst, anstatt sie an die entfernte Shell zu senden.
Escape-Sequenzen erklären
Das Menü listet zehn Escape-Sequenzen auf. Die meisten Entwickler benötigen davon nur zwei oder drei. Aber das Verständnis aller macht dich zur Person bei der Arbeit, die immer die Antwort hat.
| Schlüssel | Name | Was es tut |
|---|---|---|
~. | Erzwungener Austritt | Beendet die Verbindung sofort. Funktioniert selbst, wenn der Server völlig nicht reagiert. Dies ist der, den Sie am häufigsten verwenden werden. |
~C | SSH-Befehlszeile | Öffnet eine interaktive SSH-Eingabeaufforderung mitten in der Sitzung. Von hier aus können Sie Port-Weiterleitungsregeln hinzufügen oder entfernen, ohne die Verbindung zu trennen. Geben Sie help darin ein. |
~# | Portweiterleitungen auflisten | Gibt eine Liste aller aktiven Port-Forwarding-Verbindungen in der aktuellen Sitzung aus. |
~B | Sende BREAK | Sendet ein Hardware-BREAK-Signal an das entfernte System. Nützlich für serielle Konsolen, Router oder eingebettete Geräte. |
~R | Neustart anfordern | Initiiert einen neuen kryptografischen Schlüsselaustausch mitten in einer Sitzung. Gut für lang andauernde Sitzungen in sicherheitskritischen Umgebungen. |
~V/~v | Sprachumfang anpassen | Erhöht oder verringert die Protokollausführlichkeit von SSH in Echtzeit. Nützlich zum Debuggen einer aktiven Verbindung, ohne sich erneut verbinden zu müssen. |
~^Z | Anhalten | Setzt den SSH-Prozess lokal aus. Führen Sie fg aus, um die Sitzung wieder in den Vordergrund zu bringen. |
~& | Hintergrund | Verschiebt SSH in den Hintergrund, während es darauf wartet, dass aktive weitergeleitete Verbindungen geschlossen werden. Die Verbindung bleibt bestehen. |
~~ | Wörtliche Tilde | Sendet ein tatsächliches Tilde-Zeichen an das entfernte System. Tippen Sie es zweimal, um eines durchzugeben. |
~? | Hilfe anzeigen | Zeigt das Escape-Menü erneut an. Eine hilfreiche Erinnerung, wenn Sie vergessen, welche Taste was macht. |
Wie man SSH-Escape-Sequenzen verwendet
1. Eine eingefrorene SSH-Sitzung sofort mit ~ beenden. (Hängende SSH erzwingen schließen)
Lassen Sie uns ~. die Aufmerksamkeit schenken, die es verdient, denn gerade dieser eine Befehl ist es wert, den gesamten Artikel zu lesen.
Wenn eine SSH-Sitzung hängt, sind die üblichen Optionen miserabel. Sie können ein paar Minuten oder länger warten und hoffen, dass der TCP-Timeout die Dinge schließlich bereinigt. Sie können das gesamte Terminalfenster schließen. Oder Sie können die SSH-Prozess-ID von einem zweiten Terminal aus suchen und ihn manuell beenden. All diese Optionen verschwenden Zeit.
Mit ~. ist nichts davon notwendig. Sie drücken Enter, tippen ~. und die Sitzung schließt sich in weniger als einer Sekunde.
Enter
~.Dieser Befehl beendet die SSH-Verbindung sofort und Ihr lokaler Prompt kehrt sofort zurück. Kein Warten. Kein zweites Terminal. Keine Maus erforderlich.
Hinweis: Die genauen Schritte, wenn Ihre Sitzung hängt: Drücken Sie
Enter→ tippen Sie~→ tippen Sie.
Sie werdenVerbindung zu [Host] geschlossen.auf dem Bildschirm sehen, und Ihr lokaler Shell-Prompt kehrt zurück.
Dies funktioniert, weil Ihr lokaler SSH-Client den Befehl ~. vollständig eigenständig verarbeitet. Er benötigt die Zusammenarbeit des entfernten Servers nicht. Er trennt einfach die TCP-Verbindung und gibt die Kontrolle an Sie zurück.
Warum das wichtig ist:
- Der entfernte Server kann die Antwort verweigern.
- Die Netzwerkverbindung kann unterbrochen werden.
- Die Shell kann hängen bleiben.
In diesen Fällen bewirkt Strg+C nichts, da dieses Signal an die entfernte Shell gesendet wird. ~. hingegen spricht direkt mit dem SSH-Client. Der Client schließt die Verbindung sofort.
Viele erfahrene Linux-Administratoren betrachten dies als einen unbedingt zu kennenden SSH-Trick.
2. Port-Weiterleitung unterwegs mit ~C
Der zweitnützlichste Befehl ist ~C, und er löst ein Problem, das viele Entwickler überrascht. Stell dir vor, du befindest dich bereits in einer SSH-Sitzung und stellst fest, dass du beim Verbinden vergessen hast, eine Portweiterleitung einzurichten. Normalerweise ist die einzige Lösung, die Verbindung zu trennen und mit den richtigen -L-Flags erneut zu verbinden.
Aber mit ~C müssen Sie sich nicht neu verbinden. Wenn Sie Enter und dann ~C drücken, öffnet sich ein interaktives ssh>-Prompt direkt in Ihrer aktuellen Sitzung. Von dort aus können Sie lokale oder entfernte Portweiterleitungsregeln hinzufügen, bestehende abbrechen und prüfen, was aktiv ist — alles ohne Ihre Verbindung zu unterbrechen.
Schnelles Beispiel
Drücken Sie Enter, geben Sie ~C ein.
Sie werden so etwas sehen:
ssh>Geben Sie an der ssh>-Eingabeaufforderung Folgendes ein:
-L 8080:localhost:80Dies leitet Ihren lokalen Port 8080 an Port 80 auf dem entfernten Server weiter. Drücken Sie dann Enter und Ihre Sitzung wird genau wie zuvor fortgesetzt, mit dem neuen Tunnel aktiv.
Geben Sie help an der ssh>-Eingabeaufforderung ein, um alle verfügbaren Unterbefehle anzuzeigen.
Normalerweise müssen Sie sich erneut verbinden, um einen Tunnel zu erstellen. Diese Funktion erspart diesen Schritt.
3. Verschachtelte Sitzungen und der Tilde-Multiplikator
Hier wird es interessant. Viele Entwickler arbeiten über Jump-Hosts oder Bastion-Server — man SSHt in Maschine A, dann von dort in Maschine B und möglicherweise weiter. Wenn man einen Escape-Befehl an eine bestimmte Schicht in dieser Kette senden muss, fügt man pro Sprung ein zusätzliches Tilde hinzu.
Der äußere SSH-Client verbraucht das erste Tilde-Zeichen und gibt den Rest an die innere Sitzung weiter. Also:
- Um die erste innere Sitzung zu verlassen:
Enter→~~. - Um die zweite innere Sitzung zu beenden:
Enter→~~~. - Jede Tilde schält eine Schicht der Kette ab.
Beispiel: Drei-Stufen-Sitzung
ostechnix@local:~$ ssh bastion # hop 1
ostechnix@bastion:~$ ssh prod-server # hop 1 → 2
ostechnix@prod:~$ # hop 1 → 2 → 3
# To close prod-server only (innermost):
ostechnix@prod:~$ [Enter ~~.] → Connection to prod-server closed.
ostechnix@bastion:~$ # still on hop 2
# To close bastion:
ostechnix@bastion:~$ [Enter ~.] → Connection to bastion closed.
ostechnix@local:~$ # back homeDieses Tilde-Multiplikator-Muster gilt für jeden Escape-Befehl. Um also eine Befehlszeile innerhalb der innersten Sitzung zu öffnen, geben Sie ~~C ein. Um Portweiterleitungen in der inneren Sitzung aufzulisten, geben Sie ~~# ein. Die Logik bleibt durchgängig konsistent.
Hier ist ein weiteres Beispiel:
ssh server1
ssh server2
ssh server3Jetzt sitzt du drei SSH-Sitzungen tief.
Wenn du läufst:
Enter
~.SSH beendet nur die aktuelle Sitzung.
Du gehst Schritt für Schritt vor:
server3 → server2 → server1 → local machineManchmal möchte man jedoch das Escape-Zeichen an eine innere SSH-Sitzung senden. In diesem Fall geben Sie ein:
~~Dies sendet ein wörtliches ~, anstatt die Escape-Sequenz auszulösen.
4. Die SSH-Sitzung unterbrechen
Sie können die SSH-Sitzung wie einen normalen Linux-Prozess anhalten.
Enter
~^ZHier ist ^Z STRG+Z.
Der SSH-Prozess wechselt in den Hintergrund.
Bring es später mit:
fgDieser Trick funktioniert gut, wenn Sie einen schnellen Befehl lokal ausführen möchten, ohne Ihre SSH-Sitzung zu schließen.
5. Liste der aktiven Portweiterleitungen
Wenn Sie häufig SSH-Tunnel verwenden, hilft dieser Befehl.
Enter
~#SSH zeigt alle aktiven weitergeleiteten Verbindungen an.
Beispielausgabe:
The following connections are open:
#0 client-session (t4 [session] r0 i0/0 o0/0 e[write]/4 fd 4/5/6 sock -1 cc -1 io 0x01/0x01)Dies hilft Ihnen zu bestätigen, welche Tunnels aktiv sind.
6. Ändern der SSH-Debug-Ausführlichkeit
Sie können das SSH-Protokollieren erhöhen oder verringern.
Enter
~VOder,
Enter
~vDiese Funktion hilft, wenn Sie Verbindungsprobleme beheben.
SSH-Escape-Zeichen-Spickzettel
Hier ist jeder praktische Befehl in einer Liste zusammengefasst. Lesezeichen setzen oder in Ihre Notizen-App einfügen.
- Menü anzeigen:
Enter→~? - Beende eine eingefrorene Sitzung:
Enter→~. - Port-Weiterleitung live hinzufügen:
Enter→~C→ tippe deine Regel - Aktive Port-Weiterleitungen auflisten:
Enter→~# - In den lokalen Hintergrund aussetzen:
Enter→~^Z(Fortsetzen mitfg) - Mit mehr Protokollierung debuggen:
Enter→~v(oder~Vzum Verringern) - Am innersten verschachtelten Sitzungsende verlassen:
Enter→~~. - Zweite verschachtelte Sitzung beenden:
Enter→~~~. - Sende ein genaues Tilde-Zeichen:
Enter→~~
Wo hat sich das versteckt?
Diese Escape-Sequenzen sind in den offiziellen OpenSSH-Handbuchseiten vollständig dokumentiert. Führen Sie man ssh in Ihrem Terminal aus und suchen Sie nach dem Abschnitt mit dem Titel ESCAPE CHARACTERS. Alles oben Genannte ist dort enthalten, in präziser technischer Sprache geschrieben.
Warum also weiß fast niemand davon? Weil Handbuchseiten lang, dicht und nur wenige Entwickler sie vollständig lesen. Die Informationen waren schon immer öffentlich – sie haben nur nie die Aufmerksamkeit bekommen, die sie verdienten.
Das nächste Mal, wenn ein Kollege darüber klagt, dass er Terminal-Fenster über eine eingefrorene SSH-Sitzung schließen muss, weißt du genau, was du ihm sagen sollst. Und das Mal danach. Und jedes Mal danach.
Ein Tipp, den man sich merken sollte
Wenn Sie sich nur einen Befehl merken, merken Sie sich diesen:
Enter
~.Diese einfache Sequenz kann eine eingefrorene SSH-Sitzung sofort beenden.
Es funktioniert sogar, wenn der entfernte Server nicht mehr reagiert. Das allein macht es zu einem wertvollen Trick für jeden, der mit Linux-Servern arbeitet.
Häufige Missverständnisse über die SSH-Escape-Sequenzen
Hier sind die häufigsten Missverständnisse über das SSH-Escape-Menü.
1. "Dies ist ein neuer Hack, den kürzlich jemand entdeckt hat"
Es ist weder neu noch verborgen. SSH-Escape-Sequenzen sind seit dem Start des Projekts im Jahr 1999 in der OpenSSH-Dokumentation enthalten.
Sie befinden sich auf der Man-Seite unter ESCAPE-ZEICHEN. Dies ist ein vollständig dokumentiertes, offizielles Feature — kein Trick, Exploit oder Workaround. Das Einzige, was überraschend ist, ist, wie selten darüber gesprochen wird.
2. „Es funktioniert nur unter Linux“
Falsch bei jeder Plattformannahme. Die Escape-Sequenzen befinden sich im SSH-Client, nicht im Betriebssystem. Daher funktionieren sie im macOS-Terminal, im Windows-Terminal mit OpenSSH und in WSL – in jeder Umgebung, die einen ordnungsgemäßen OpenSSH-Client ausführt. Das Betriebssystem des entfernten Servers ist völlig irrelevant.
Wenn Sie PuTTY verwenden, werden diese speziellen Escape-Sequenzen nicht unterstützt. PuTTY implementiert das OpenSSH-Tilde-Escape-System nicht, daher müssen Sie zu einem OpenSSH-basierten Client wechseln, um sie zu verwenden.
3. "Das Schließen des Terminalfensters bewirkt dasselbe wie ~."
Dies sind sehr unterschiedliche Aktionen. Das Schließen des Terminals beendet den gesamten Terminalemulatorprozess – was Hintergrundprozesse verwaisen lassen, mehrfach genutzte Sitzungen unterbrechen und Portweiterleitungen offen lassen kann.
~. sendet ein sauberes Beendigungssignal über das SSH-Protokoll, schließt die Verbindung ordnungsgemäß und bereinigt die Ressourcen.
4. "Wenn der Server eingefroren ist, funktioniert nichts"
Dies ist das größte Missverständnis und das am meisten zu korrigierende. Einige Neulinge nehmen an, dass eine eingefrorene Sitzung bedeutet, dass sie machtlos sind. Aber ~. greift niemals auf den Server zu. Es läuft lokal, auf deinem Rechner, und trennt einfach die TCP-Verbindung. Der Zustand des Servers ist völlig irrelevant dafür, ob ~. funktioniert.
5. "Sie benötigen Root- oder spezielle Berechtigungen, um es zu verwenden"
Es sind überhaupt keine Berechtigungen erforderlich. Dies sind clientseitige Tastenkombinationen, die jedem Benutzer zur Verfügung stehen, der eine beliebige SSH-Sitzung ausführt. Kein Sudo, keine Konfigurationsänderungen, kein Administratorzugang erforderlich — nur eine aktive SSH-Verbindung und das Wissen, dass das Menü existiert.
6. "~. und Strg+C erledigen dieselbe Aufgabe"
Strg+C sendet ein Interrupt-Signal an den entfernten Prozess — was voraussetzt, dass die Verbindung aktiv und reaktionsfähig ist, damit es funktioniert. Wenn die Sitzung eingefroren ist, bewirkt Strg+C nichts. ~. umgeht die Verbindung vollständig und funktioniert immer, unabhängig davon, was die entfernte Seite gerade tut.
7. „Es funktioniert bei jedem SSH-Befehl, den Sie ausführen“
Dieser trifft selbst erfahrene Benutzer unvorbereitet. Escape-Sequenzen funktionieren nur, wenn Ihre SSH-Sitzung ein Pseudo-Terminal (PTY) zugewiesen bekommen hat, was automatisch in normalen interaktiven Sitzungen geschieht, in denen Sie Befehle eingeben und eine Shell-Eingabeaufforderung erhalten. In nicht-interaktiven SSH-Aufrufen wie ssh user@host "some-command" schlagen sie jedoch stillschweigend fehl, da in diesen Fällen kein PTY angefordert wird.
Wenn Sie also einen einmaligen Remote-Befehl über SSH ausführen, anstatt eine vollständige Shell zu öffnen, reagieren Escape-Sequenzen nicht. Für den alltäglichen interaktiven Gebrauch werden Sie diese Einschränkung nie erleben.
Fazit
Das SSH-Escape-Menü ist eines dieser Features, von denen man, sobald man sie kennt, sich nicht vorstellen kann, ohne sie zu arbeiten. Es ist eine nützliche integrierte Funktion, die sogar dann funktioniert, wenn sonst nichts funktioniert.
Beim nächsten Einfrieren Ihrer SSH-Sitzung: Drücken Sie Enter, tippen Sie ~. und Sie sind in weniger als einer Sekunde wieder an Ihrer lokalen Eingabeaufforderung. Keine Maus. Kein neues Terminal. Kein Warten.
Sobald Sie über das SSH-Escape-Menü Bescheid wissen, erhalten Sie mehrere nützliche Möglichkeiten:
- Verlassen Sie sofort hängende Sitzungen
- Tunnel erstellen, ohne sich erneut zu verbinden
- SSH-Prozesse anhalten
- Aktive Portweiterleitungen überprüfen
Diese kleinen Tricks sparen beim tatsächlichen Troubleshooting oft Zeit.
Wenn Sie SSH täglich verwenden, verdient diese Funktion einen Platz in Ihrem Werkzeugkasten.
Weiterführende Literatur:
Führen Sie man ssh aus und suchen Sie nach ESCAPE CHARACTERS, um die offizielle Dokumentation zu lesen. Das OpenSSH-Projekt pflegt auch Dokumentationen auf openssh.com.



