- Wenn eine SSH-Sitzung hängen bleibt, lassen sich verschiedene Dinge steuern, ohne den Prozess zwangsweise beenden zu müssen – über das in SSH eingebaute Escape-Sequenz-Menü
- Gibt man innerhalb der Sitzung nach
↵Enter ~? ein, wird eine Liste versteckter Befehle angezeigt, und mit ~. lässt sich die Verbindung in jeder Situation sofort trennen
- Diese Escape-Sequenzen sind in den SSH-Client selbst eingebaut und funktionieren auch dann, wenn der Server nicht antwortet oder die Verbindung unterbrochen ist
- In verschachtelten SSH-Sitzungen kann man mit
~~ die Sequenz an den inneren Client weiterreichen
- Zusätzlich werden nützliche SSH-Optionen wie
-C, -v und -D vorgestellt
SSH-Escape-Sequenz-Menü
- Innerhalb einer SSH-Sitzung kann man nach
↵Enter und der Eingabe von ~? die Liste der unterstützten Escape-Sequenzen anzeigen
- Wichtige Sequenzen:
~. — Verbindung beenden (einschließlich multiplexter Sitzungen)
~B — BREAK-Signal an das entfernte System senden
~C — Kommandozeile öffnen (Port-Forwarding kann konfiguriert werden, mit help gibt es Hinweise)
~R — Rekey anfordern
~V/v — Verbosity (LogLevel) erhöhen/verringern
~^Z — SSH anhalten (suspend)
~# — Liste der weitergeleiteten Verbindungen anzeigen
~& — SSH in den Hintergrund schicken (wenn auf das Schließen von Verbindungen gewartet wird)
~~ — das Escape-Zeichen selbst senden (zweimal eingeben)
- Diese Sequenzen sind direkt in den SSH-Client eingebaut und funktionieren daher auch, wenn der SSH-Server nicht antwortet oder die Verbindung bereits unterbrochen ist
- Am nützlichsten ist
~., weil sich damit eine festhängende Sitzung unter allen Umständen sofort beenden lässt
- Escape-Sequenzen werden nur direkt nach einem Zeilenumbruch (newline) erkannt
Verwendung in verschachtelten SSH-Sitzungen
- In einer verschachtelten Umgebung, in der man innerhalb einer SSH-Sitzung erneut per SSH verbindet, kann man mit
~~ die Sequenz an den inneren Client weitergeben
- Beispiel:
pinkie@stable:~$ ssh ponyville # stable
pinkie@ponyville:~$ ssh manehatten # stable › ponyville
pinkie@manehatten: ~$ # stable › ponyville › manehatten
pinkie@manehatten:~$ Connection to manehatten closed. # ↵Enter `~~.`
pinkie@ponyville:~$ # stable › ponyville
pinkie@ponyville:~$ ssh manehatten stable › ponyville
pinkie@manehatten: ~$ # stable › ponyville › manehatten
pinkie@manehatten:~$ Connection to ponyville closed. # ↵Enter `~.`
pinkie@stable:~$ # stable
- Im Zustand
stable → ponyville → manehatten
- bei Eingabe von
~~. wird nur die innerste Sitzung (manehatten) beendet und man kehrt zu ponyville zurück
- bei Eingabe von
~. wird auch die mittlere Sitzung (ponyville) beendet und man kehrt zu stable zurück
Bonus-SSH-Optionen
ssh -C — gzip-Komprimierung aktivieren; laut Dokumentation auf schnellen Netzwerken unnötig, aber bei TUI-Nutzung oder großer Log-Ausgabe oft sehr hilfreich für Latenz und Reaktionsfähigkeit
ssh -v — detailliertes Logging aktivieren (-vv, -vvv geben noch mehr Informationen aus); nützlich, um bei langsamen Verbindungen oder beim Zugriff auf langsame Geräte wie einen Raspberry Pi zu erkennen, ob die Verbindung hängt oder nur einfach langsam ist
ssh -D 1234 — erzeugt einen SOCKS-Proxy auf localhost:1234; damit lässt sich über das Netzwerk des Servers zugreifen, etwa für Arbeiten im serverseitigen LAN oder als einfaches DIY-VPN
5 Kommentare
Wow, das ist wirklich eine Funktion, die ich noch nie gesehen habe; jetzt muss ich das Terminal wohl nicht mehr schließen.
Wow … ich nutze SSH seit über zehn Jahren und sehe diese Funktion zum ersten Mal.
Da erscheint tatsächlich ein Menü.
Ich halte das Gerät an
Äh......
Hacker-News-Kommentare
Ich wollte mich entschieden für Manpages einsetzen. Die meisten Open-Source-Manpages sind von hoher Qualität, einige sogar wirklich hervorragend
Aber mit dem
man-Tool selbst gibt es Probleme. Ich habe zum Beispiel versucht, die Escape-Syntax~?des OpenSSH-Clients zu finden, aber sie ließ sich in der Manpage nicht suchenDer Grund ist, dass
mandas Zeichen~in eine merkwürdige Unicode-Tilde umwandelt, wodurchgrepunmöglich wird. Mit dem Zeichen-passiert dasselbe, sodass auch danach nicht gesucht werden kannDas ist für die Dokumentation von Kommandozeilen-Tools fatal. Solche Umwandlungsfunktionen sollten standardmäßig deaktiviert sein
ctrl-rwörtlich suchen (/<ctrl-r>~?)lessfunktioniert es korrektman -E asciikonnte ich es lösen. Meine Umgebung ist Cygwin 3.6.6, also könnte es ein Unterschied zwischen Distributionen seinneovimals Pager verwendet, lässt sich~?gut suchen. Man muss nur das Regex-Escaping kennen (\\~?)\\~\\?Ich nutze die Tastenkombination
~.schon lange, aber vom Hilfemenü wusste ich nichtsWenn man
~zweimal eingibt, kann man tatsächlich ein Tilde-Zeichen senden, und in einer normalen Sitzung wird es nicht als Escape erkannt, solange es nicht das erste Zeichen istDas heißt:
~funktioniert nur dann als Escape, wenn es das erste Zeichen einer Zeile und direkt nach einem Zeilenumbruch steht. Das UI-Design ist ziemlich durchdachtDeshalb kann eine Ausgabe wie
ls ~/^?^?^?^?^?~/a.outentstehen. SSH überwacht nicht den Bildschirm, sondern den Eingabestrom~.zuerst Enter drücken muss, und das kann an den Server übertragen werdenIch benutze SSH seit über 15 Jahren, aber von solchen Escape-Sequenzen höre ich zum ersten Mal
Wenn die Sitzung das nächste Mal hängt, werde ich
~.auf jeden Fall ausprobieren. Das ist viel besser, als einfach das Terminal zu schließenMit einem VPN oder Tailscale lässt sich das beheben, oder man passt den Parameter
tcp_keepalivean, um die Verbindung aktiv zu haltenBeispielkonfiguration: Damit bleibt die Sitzung auch in einer CGNAT-Umgebung erhalten
~.seit 20 Jahren jede Woche. Mit der Option-vbei SSH ist es auch nützlich zum Debuggen von Verbindungsproblemen~~.den zweiten Hop beenden~.eingibt, muss man unbedingt Enter drücken und in einer neuen Zeile beginnenIch nutze
~.ebenfalls schon lange, kannte die anderen Escapes aber nicht. An der Shell-Eingabeaufforderung funktioniert es nicht direkt, also muss mancatstarten und dann~?eingeben<enter>~.beenden~.beendet, wusste aber nicht, dass~nur in einer neuen Zeile funktioniert.~^Zscheint ebenfalls nützlich zu seinDas erinnert mich an die alte telnet-Sequenz ctrl-[
Enterdient nur dazu, eine neue Escape-Eingabe vorzubereitenDiese Funktionen stammen eigentlich von rsh. Ich bin alt genug, mich daran zu erinnern
~-Befehlsstil zuerst aus cu(1). Das war noch vor rsh, in der Zeit von 4.1BSDscp, wenn man es wie rcp verwenden will, die Option-OangebenDas Menü von SSH ist beim Tunneling nützlich. Heute wird es zwar oft durch Dinge wie Tailscale ersetzt, aber es ist weiterhin brauchbar
Damit werden mehrere SSH-Sitzungen zu einer multiplexten Verbindung gebündelt, sodass man sich nicht jedes Mal erneut authentifizieren muss und auch die Tab-Vervollständigung schneller ist
Wenn die Verbindung hängt, ist es allerdings etwas lästig
Eher nicht „geheim“, sondern einfach eine Funktion, die die meisten Leute nicht kennen, weil sie die Manpage nicht bis zum Ende lesen
Das
~-Escape wurde schon im UNIX cu der 1970er Jahre verwendet. SSH kann man als dessen Nachfolger sehenDie Standardwerte für ControlMaster sind unpraktisch, daher lohnt es sich, einen Konfigurationsblock wie diesen hinzuzufügen
Dann verwenden SSH/scp/rsync zum selben Host die bestehende Verbindung wieder
Mit dem Escape
~Ckann man während der Sitzung auch Port-Forwarding hinzufügenControlPersistauf etwa 1 Stunde erhöht, bleibt die Verbindung auch bei kurzen Login-Abständen bestehenAuch ich konnte eine hängende SSH-Sitzung nur mit
[Enter] ~.wiederherstellenDas wirkt wie eine versteckte Funktion, die man nur kennt, wenn man Linux-Experte ist
Ich wusste davon, hatte aber kaum Verwendung dafür. (...)