Wie kann ich aus ssh ausbrechen, wenn es sich sperrt?

380

Ich gehe zu Hause häufig von der Schule in meine Box, aber normalerweise ist die Pipe kaputt, wenn ich den Unterricht wechsle und mein Computer ausfällt. Ssh blockiert jedoch einfach - Ctrl+ c, Ctrl+ zund Ctrl+ dhaben keine Auswirkung.

Es ist ärgerlich, mein Terminal neu starten zu müssen, und noch ärgerlicher, ein neues Bildschirmfenster zu schließen und neu zu erstellen.

Also meine Frage, gibt es eine einfache Möglichkeit, ssh richtig sterben zu lassen (dh wenn die Pipe "normal" ausfällt, wird sie mit einer Meldung über eine kaputte Pipe beendet)? Oder muss ich herausfinden, was die PID ist und sie manuell töten?

Wayne Werner
quelle
Wenn ich mit einer aktiven SSH-Sitzung getrennt wurde, friert es ein. Ich töte es einfach und beginne eine neue Sitzung. Es gehen keine Informationen verloren, da ich den GNU-Bildschirm verwende.
Lekensteyn
Ich auch - Bildschirm ist das Beste. Aber es ist immer noch ärgerlich screen -x: P
Wayne Werner
[mosh] (mosh.mit.edu) ist eine gute Alternative, um dieses Problem zu vermeiden. Es bleibt auch bei zeitweiliger Internetverbindung in Verbindung.
Jaynp
@jaynp Der Nachteil von mosh (seit zwei Minuten) ist, dass ich nicht weiß, wie ich es trennen soll. Ich verwende eine tmux + irssi-Sitzung auf einem Remote-Host (als IRC-Bouncer) und möchte manchmal die Verbindung trennen (während tmux + irssi ausgeführt wird). Dies habe ich mit <enter> + ~ + getan. mit SSH, aber nicht mit Mosh arbeiten.
Pavel Šimerda

Antworten:

534

Normale Schlüssel werden über die sshSitzung weitergeleitet, sodass keiner dieser Schlüssel funktioniert. Verwenden Sie stattdessen die Escape-Sequenzen. Um die aktuelle Sitzung zu töten Hit anschließend Enter ↵, ~, ..

Mehr dieser Escape - Sequenzen können mit aufgeführt werden 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.)

Sie können die Liste der Escape-Sequenzen schließen, indem Sie auf klicken enter.

Beachten Sie, dass Sie N verschachtelte Verbindungen adressieren können, indem Sie N- mal aufschlagen, da das Schlagen ~~das sshSenden ~von veranlasst , anstatt es abzufangen . (Dies gilt nur für s, die direkt auf einen folgen .) Das heißt, dass eine Sitzung mit einer Tiefe von 5 Ebenen beendet wird und die anderen 4 Ebenen intakt bleiben.ssh~ ~enterenter~~~~~.ssh

Geekosaurier
quelle
48
Bei Tastaturlayouts, bei denen ~sich eine Taste inaktiv befindet , lautet die Tastenfolge Enter ~ Space ..
Søren Løvborg
1
Ich habe weitere Escape-Sequenzen hinzugefügt, die nützlich sein könnten. :)
gertvdijk
5
Beachten Sie, dass Sie die Zeile EscapeChar ~in auskommentieren müssen /etc/ssh/ssh_config(oder ~/.ssh/ssh_configwenn Sie es vorziehen).
Aditya MP
6
@Hitechcomputergeek Enter ~ ~ .Da über Ihre SSH-Sitzung ~ ~ein Literal gesendet ~wird, wird es in der zweiten SSH-Sitzung als einzelne Tilde empfangen und .als Teil des Escape interpretiert . Verwenden Sie zum Senden an die 5. verschachtelte SSH-Sitzung einfach 5 Tilden in Ihrer Escape-Sequenz.
Score_Under
4
lebensverändernd;)
artm
54

Möglicherweise möchten Sie auch Keep-Alives auf Anwendungsebene für SSH einrichten, um zu verhindern , dass SSH bei Verbindungsproblemen einfriert. Meine ~/.ssh/configenthält Folgendes:

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

Dadurch sendet der ssh-Client alle 15 Sekunden Keep-Alives auf Anwendungsebene. Wenn drei von ihnen nacheinander fehlschlagen (Standardeinstellung von ServerAliveCountMax), betrachtet der Client die Verbindung als hängengeblieben und schließt sie.

Im Gegensatz zur anderen Option TCPKeepAlivewird dies im verschlüsselten Kanal geprüft und ist nicht fälschbar.


Es wird angemerkt, dass diese Keep-Alives auch dazu beitragen, lange inaktive Verbindungen aufrechtzuerhalten , dh Sie daran zu hindern, halbgeschlossene TCP-Sitzungen stundenlang unberührt zu lassen.

Ich empfehle dringend, diese Funktion zu aktivieren, wenn Sie regelmäßig darauf stoßen, aber Sie sollten auch über das geringfügige Sicherheitsrisiko informiert sein, das dadurch entstehen kann. Ein bekannter Klartextangriff wird möglicherweise einfacher, wenn der Angreifer das Intervall und den Inhalt einer inaktiven Verbindung kennt. Dies könnte der Grund sein, warum es nicht standardmäßig aktiviert ist.

ulidtko
quelle
3
Sicherheits Gründe. Sie könnten etwas trinken gehen und ssh sessio offen lassen, und Ihr Laborpartner, mit dem Sie in den letzten 20 Jahren zusammengearbeitet haben, könnte Ihre Sitzung verwenden, um den Server zu entführen und zu zerstören ... während Sie in Ihrer 10-minütigen Pause getrunken haben.
Luis Alvarado
2
@CYREX, was? Und wie kann die standardmäßig deaktivierte Option verhindern, dass Sie unfaire Laborpartner haben? %)
ulidtko
1
@ulidtko: Gibt es einen Grund, nicht ServerAliveIntervalauf 1 zu setzen, damit eine unterbrochene Verbindung sofort erkannt wird?
krlmlr
2
@gertvdijk: Danke. Bei mir funktioniert es auch ohne HostLeitung. "Moderne Verschlüsselungsverfahren wie Advanced Encryption Standard sind derzeit nicht anfällig für bekannte Klartextangriffe." (von dem Link, den Sie hinzugefügt haben) ...
krlmlr
2
Sie können SSH auch durch Mosh (mobile Shell) ersetzen. Mosh stellt über SSH eine Verbindung zum Server her, baut dann jedoch einen UDP-basierten Kanal auf, der gegen Verbindungsprobleme resistent ist. Mosh hat auch ein lokales Echo, sodass Sie sehen können, was Sie eingeben, auch wenn der Server nicht antwortet. Wenn die Tastenanschläge übermittelt werden, markiert Mosh den wiedergegebenen Text. mosh.mit.edu
Pascal Rosin
41

Wie in der Antwort von Geekosaurier vermerkt, ~.wird die Verbindung durch die Escape-Sequenz beendet.

Die vollständige Liste der Escape-Sequenzen und ihrer Funktionen kann angezeigt werden, indem Sie Folgendes eingeben ~?:

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
quelle
Wie schließe ich die Liste der Escape-Sequenzen?
Kristianp
3
Nachdem die Escape-Sequenzliste gedruckt wurde, ist sie nicht mehr bereit, die nächste zu akzeptieren.
Tejas Kale