54 Punkte von GN⁺ 2026-03-13 | 5 Kommentare | Auf WhatsApp teilen
  • 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)
    • ~BBREAK-Signal an das entfernte System senden
    • ~CKommandozeile öffnen (Port-Forwarding kann konfiguriert werden, mit help gibt es Hinweise)
    • ~RRekey 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 -Cgzip-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 -vdetailliertes 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

 
t7vonn 2026-03-13

Wow, das ist wirklich eine Funktion, die ich noch nie gesehen habe; jetzt muss ich das Terminal wohl nicht mehr schließen.

 
xguru 2026-03-13

Wow … ich nutze SSH seit über zehn Jahren und sehe diese Funktion zum ersten Mal.
Da erscheint tatsächlich ein Menü.

 
bus710 2026-03-13

Ich halte das Gerät an
Äh......

 
GN⁺ 2026-03-13
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 suchen
    Der Grund ist, dass man das Zeichen ~ in eine merkwürdige Unicode-Tilde umwandelt, wodurch grep unmöglich wird. Mit dem Zeichen - passiert dasselbe, sodass auch danach nicht gesucht werden kann
    Das ist für die Dokumentation von Kommandozeilen-Tools fatal. Solche Umwandlungsfunktionen sollten standardmäßig deaktiviert sein

    • Das Problem mit der Zeichenumwandlung kenne ich nicht, aber man kann mit ctrl-r wörtlich suchen (/<ctrl-r>~?)
    • Im Debian-Standard-Pager less funktioniert es korrekt
    • Mit der Option man -E ascii konnte ich es lösen. Meine Umgebung ist Cygwin 3.6.6, also könnte es ein Unterschied zwischen Distributionen sein
    • Wenn man neovim als Pager verwendet, lässt sich ~? gut suchen. Man muss nur das Regex-Escaping kennen (\\~?)
    • Auch unter macOS und CentOS funktioniert die Suche nach \\~\\?
  • Ich nutze die Tastenkombination ~. schon lange, aber vom Hilfemenü wusste ich nichts
    Wenn 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 ist
    Das 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 durchdacht

    • Zur Erklärung für jüngere Leser: Im Echo-Modus des Terminals löscht Backspace den eigentlichen Eingabepuffer nicht
      Deshalb kann eine Ausgabe wie ls ~/^?^?^?^?^?~/a.out entstehen. SSH überwacht nicht den Bildschirm, sondern den Eingabestrom
    • Der Nachteil ist, dass man bei einer hängenden Sitzung zum Beenden mit ~. zuerst Enter drücken muss, und das kann an den Server übertragen werden
  • Ich 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ßen

    • Wenn SSH-Verbindungen häufig abbrechen, kann das an einem kurzen TCP-Timeout von CGNAT liegen
      Mit einem VPN oder Tailscale lässt sich das beheben, oder man passt den Parameter tcp_keepalive an, um die Verbindung aktiv zu halten
      Beispielkonfiguration:
      net.ipv4.tcp_keepalive_time=240
      net.ipv4.tcp_keepalive_intvl=60
      net.ipv4.tcp_keepalive_probes=120
      
      Damit bleibt die Sitzung auch in einer CGNAT-Umgebung erhalten
    • Ich benutze ~. seit 20 Jahren jede Woche. Mit der Option -v bei SSH ist es auch nützlich zum Debuggen von Verbindungsproblemen
    • Wenn man SSH über mehrere Stufen verbindet, kann man mit ~~. den zweiten Hop beenden
    • Ich verwende es auch seit fast 30 Jahren, und davor habe ich rsh benutzt. Siehe Berkeley r-commands
    • Bevor man ~. eingibt, muss man unbedingt Enter drücken und in einer neuen Zeile beginnen
  • Ich nutze ~. ebenfalls schon lange, kannte die anderen Escapes aber nicht. An der Shell-Eingabeaufforderung funktioniert es nicht direkt, also muss man cat starten und dann ~? eingeben

    • Es funktioniert trotzdem. OpenSSH überwacht nicht die Ausgabe, sondern nur die Eingabe, daher kann man mit <enter>~. beenden
    • Ich habe Sitzungen auch immer mit ~. beendet, wusste aber nicht, dass ~ nur in einer neuen Zeile funktioniert. ~^Z scheint ebenfalls nützlich zu sein
      Das erinnert mich an die alte telnet-Sequenz ctrl-[
    • Der SSH-Client erkennt Escapes, auch wenn er den Modus der entfernten Sitzung nicht kennt. Enter dient nur dazu, eine neue Escape-Eingabe vorzubereiten
  • Diese Funktionen stammen eigentlich von rsh. Ich bin alt genug, mich daran zu erinnern

    • Tatsächlich kam der ~-Befehlsstil zuerst aus cu(1). Das war noch vor rsh, in der Zeit von 4.1BSD
    • Heutzutage muss man bei scp, wenn man es wie rcp verwenden will, die Option -O angeben
    • Als jemand, der sich noch an die Zeit von uucp!bangpath erinnert, muss ich darüber lachen
  • Das Menü von SSH ist beim Tunneling nützlich. Heute wird es zwar oft durch Dinge wie Tailscale ersetzt, aber es ist weiterhin brauchbar

    • Wenn ich in einem neuen Tab „Neue Verbindung“ öffne, nutze ich die Funktion ControlMaster
      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
    • Ich benutze oft tuns.sh. Es ist praktisch, weil man damit localhost nach außen exponieren kann
  • 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 sehen

  • Die Standardwerte für ControlMaster sind unpraktisch, daher lohnt es sich, einen Konfigurationsblock wie diesen hinzuzufügen

    Host *
      ControlMaster auto
      ControlPath ~/.ssh/sockets/%r@%h:%p
      ControlPersist 10m
    

    Dann verwenden SSH/scp/rsync zum selben Host die bestehende Verbindung wieder
    Mit dem Escape ~C kann man während der Sitzung auch Port-Forwarding hinzufügen

    • Wenn man ControlPersist auf etwa 1 Stunde erhöht, bleibt die Verbindung auch bei kurzen Login-Abständen bestehen
    • Zu diesem Kommentar gab es auch den Scherz, er klinge, als sei er von einem LLM geschrieben
  • Auch ich konnte eine hängende SSH-Sitzung nur mit [Enter] ~. wiederherstellen
    Das wirkt wie eine versteckte Funktion, die man nur kennt, wenn man Linux-Experte ist

 
kayws426 2026-03-13

Ich wusste davon, hatte aber kaum Verwendung dafür. (...)