So stellen Sie die Verbindung zu einer getrennten SSH-Sitzung wieder her

157

Gibt es eine Möglichkeit, eine Verbindung zu einer SSH-Sitzung herzustellen, die getrennt wurde? Wir haben Probleme mit unserer Netzwerkverbindung zu einem Remote-Standort, an dem wir separat arbeiten. In der Zwischenzeit tritt jedoch eine große Anzahl von Verbindungsabbrüchen aufgrund verlorener Pakete auf, wenn eine Verbindung zu Servern am Remotestandort besteht. Oft bleibt die Sitzung für eine Weile aktiv und manchmal befindet sie sich mitten in einer Aktion (Dateibearbeitung, Ausführen eines Prozesses usw.), zu der ich zurückkehren muss, anstatt nach Möglichkeit neu zu starten.

palehorse
quelle
10
Ich kann nicht glauben, dass niemand mosh.mit.edu
jwbensley am
@javano: Ich habe noch nie davon gehört. Füge das als Antwort hinzu!
kbyrd
@ kbyrd getan haben;)
jwbensley
Eine ähnliche Frage wurde in unix.stackexchange.com/questions/105001/… mit einigen Hinweisen dazu gestellt, wie die
Unterbrechungen an

Antworten:

136

UPDATE: Für eine aktuelle Antwort siehe die Antwort von zero_r unten

Dies ist keine Antwort, sondern eine Problemumgehung. Verwenden Sie Bildschirm .

Wenn Sie sich zum ersten Mal anmelden, führen Sie screen aus. Sie erhalten eine andere Shell, in der Sie Befehle ausführen. Wenn Sie nicht verbunden sind, hält der Bildschirmprozess das Terminal am Leben, damit Ihre Shell und die von ihr ausgeführten Prozesse nicht umfallen. Wenn Sie die Verbindung wiederherstellen, führen Sie 'screen -r' aus, um fortzufahren.

Die Konfiguration und Verwendung des Bildschirms erfordert noch eine Menge mehr, aber die oben genannten Maßnahmen sollten Ihr Problem umgehen.

kbyrd
quelle
18
Oder benutze tmux - ein "cooler" Bildschirm, ich habe beides benutzt und bevorzuge tmux, weil du den Begriff schön teilen kannst.
John Hunt
3
Ich war froh screen, festgestellt zu haben, dass es bereits auf meinem Ubuntu 12.x installiert war. Wenn Sie sich also nicht sicher sind, versuchen Sie es einfach mit diesem Befehl. Es stellte die Verbindung wieder her und setzte den Aktualisierungsprozess fort : sudo screen -D -r
bjm88
1
@ bjm88, sudosollte nur verwendet werden, wenn die ursprüngliche Bildschirmsitzung mit sudo initiiert wurde. Andernfalls wird es zurückgegeben, als ob keine Bildschirmsitzung existiert:There is no screen to be detached
Noam Manos
+1 Mir ist klar, dass dies nicht die eigentliche Antwort ist. jedoch screen -rwar genau das, was ich suchte.
Eric Nelson
129

Versuchen Sie, ClientAliveInterval (z. B. 60) und TCPKeepAlive (yes oder no) auf der Serverseite sshd.conf auf die entsprechenden Werte zu setzen.

Dies sollte Ihre Sitzung am Leben erhalten, auch wenn die Verbindung für Minuten unterbrochen wird.

zero_r
quelle
24
Bisher scheinen Sie der einzige zu sein, der die Frage tatsächlich beantwortet, anstatt den Bildschirm als Problemumgehung vorzuschlagen.
kbyrd
2
Guter Anruf. Wir haben diese Methode als besonders nützlich beim Durchlaufen von Cisco ASA / PIX-Firewalls empfunden, bei denen standardmäßig das Timeout von TCP-Verbindungen bevorzugt wird.
Mike Pountney
5
Vielleicht ist dies nicht der richtige Ort, um zu fragen, aber kann das Poster Antworten austauschen? Wir sollten die 'Bildschirm'-Antwort (meine ist nicht die beste, ich mag Mike Pountneys, aber ich habe den Repräsentanten) mit diesen Informationen beantworten.
kbyrd
1
Funktioniert dies, wenn eine Verbindung über eine Cisco VPN-Verbindung hergestellt wird und die VPN-Verbindung verloren geht und wiederhergestellt wird?
Brent
Für mich funktioniert der Bildschirm perfekt, ich kann mich wieder mit der gescreenten Aufgabe verbinden und zur Arbeit zurückkehren
integratorIT
65

Wie oben erwähnt, ist GNU Screen der richtige Weg. Sie können auf der Remote-Box eine "Bildschirmsitzung" durchführen, in der Sie über mehrere "Bildschirmfenster" mehrere Befehle ausführen können. Dadurch wird die Verbindung einfach getrennt, wenn die übergeordnete SSH-Verbindung unterbrochen wird, und alle darin ausgeführten Unterprozesse bleiben erhalten.

' man screen' ist wie gewohnt dein Freund, und das Betriebssystempaket sollte ' screen' heißen , wenn es nicht standardmäßig installiert ist.

Grundlagen sind:

  • Starten Sie eine Bildschirmsitzung (auf Ihrem Remote-Host):

    $ screen
    
  • Trennen Sie von Ihrem Bildschirm - Sitzung: CTRL-A,d

  • Stellen Sie die Verbindung zu Ihrer Bildschirmsitzung wieder her, nachdem Sie sich erneut angemeldet haben:

    $ screen -d -r
    
  • Öffnen Sie einen anderen Bildschirm , Fenster ': CTRL-A,c

  • Zyklus durch Öffnen von Bildschirmfenster: CTRL-A,space

Es gibt viele coole Sachen, die Sie mit Screen machen können. Ich benutze es seit über 10 Jahren und finde immer noch neue Funktionen heraus. Es ist mein Lieblings-Unix-Dienstprogramm.

Mike Pountney
quelle
1
Ja, das ist eine viel bessere Antwort als meine.
kbyrd
Kann ich trotzdem eine Verbindung zur getrennten SSH-Sitzung herstellen, wenn ich meinen PC neu starte, auf dem der Bildschirm ausgeführt wird?
BarathVutukuri
tmux ist mächtiger
Pegasus
46

Ich kann nicht glauben, dass niemand MOSH erwähnt hat ;

Mosh ist ein separates Protokoll, das sich in den SSH-Anmeldevorgang einbinden kann. Es hält Ihre Sitzung nach Tagen der Trennung, Änderung der IP-Adresse, hoher Latenz usw. am Leben. Es wird auf der Homepage besser erklärt, als ich es erklären kann, daher habe ich die Beschreibung unten kopiert. Meine Erfahrungen und Ratschläge sind, dass ich es auf meinem Android-Handy verwende, es ist ein Lebensretter beim Reisen und SSH'ing. Das Gleiche gilt für meinen Laptop, wenn er zum Beispiel mit einem Mobiltelefon im Zug verbunden ist. Ich empfehle, aus dem Quellcode zu kompilieren, um die neueste Version zu erhalten. Die für mich in Ubuntu verwendete Repo-Version weist einige Unannehmlichkeiten auf, die in der neuesten Version (zum Zeitpunkt des Schreibens) behoben sind.

Mosh (mobile Schale)

Remote-Terminal-Anwendung, die Roaming ermöglicht, intermittierende Konnektivität unterstützt und intelligentes lokales Echo und Leitungsbearbeitung von Benutzertastenanschlägen bietet.

Mosh ist ein Ersatz für SSH. Es ist robuster und reaktionsschneller, insbesondere über Wi-Fi, Mobilfunk und Fernverbindungen.

Mosh ist freie Software für GNU / Linux, FreeBSD, Solaris, Mac OS X und Android.

Funktionen von der Website:

  • IP ändern. In Verbindung bleiben : Mosh wechselt automatisch zwischen Internetverbindungen. Verwenden Sie Wi-Fi im Zug, Ethernet in einem Hotel und LTE am Strand: Sie bleiben angemeldet. Die meisten Netzwerkprogramme, einschließlich SSH und Web-Apps wie Google Mail, verlieren nach dem Roaming die Verbindung. Mosh ist anders.

  • Für süße Träume : Mit Mosh können Sie Ihren Laptop in den Ruhezustand versetzen und später wieder aufwecken, sodass Ihre Verbindung erhalten bleibt. Wenn Ihre Internetverbindung unterbrochen wird, werden Sie von Mosh gewarnt. Die Verbindung wird jedoch wieder hergestellt, sobald der Netzwerkdienst wieder verfügbar ist.

  • Werde Netzwerkverzögerungen los : SSH wartet auf die Antwort des Servers, bevor es dir deine eigene Eingabe zeigt. Das kann zu einer miesen Benutzeroberfläche führen. Mosh ist anders: Es gibt eine sofortige Antwort auf das Eingeben, Löschen und Bearbeiten von Zeilen. Es macht dies adaptiv und funktioniert sogar in Vollbildprogrammen wie Emacs und Vim. Bei einer schlechten Verbindung werden herausragende Vorhersagen unterstrichen, damit Sie nicht irregeführt werden.

  • Kein privilegierter Code. Kein Daemon : Sie müssen nicht der Superuser sein, um Mosh zu installieren oder auszuführen. Der Client und der Server sind ausführbare Dateien, die von einem normalen Benutzer ausgeführt werden und nur für die Dauer der Verbindung gültig sind.

  • Gleiche Anmeldemethode : Mosh überwacht weder Netzwerkports noch authentifiziert er Benutzer. Der mosh-Client meldet sich über SSH beim Server an und die Benutzer geben die gleichen Anmeldeinformationen (z. B. Kennwort, öffentlicher Schlüssel) wie zuvor an. Dann führt Mosh den Mosh-Server aus der Ferne aus und stellt über UDP eine Verbindung zu ihm her.

  • Läuft in Ihrem Terminal, aber besser : Mosh ist ein Befehlszeilenprogramm wie ssh. Sie können es in xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, screen oder tmux verwenden. Aber mosh wurde von Grund auf neu entwickelt und unterstützt nur einen Zeichensatz: UTF-8. Es behebt Unicode-Fehler in anderen Terminals und in SSH.

  • Control-C funktioniert hervorragend : Im Gegensatz zu SSH behandelt das UDP-basierte Protokoll von mosh den Paketverlust ordnungsgemäß und legt die Framerate basierend auf den Netzwerkbedingungen fest. Mosh füllt keine Netzwerkpuffer, daher arbeitet Control-C
    immer, um einen außer Kontrolle geratenen Prozess anzuhalten.

jwbensley
quelle
8
Mosh ist kein ssh-Wrapper - es ist ein anderes Protokoll, das fast nichts mit ssh zu tun hat (es verwendet nur ssh für die Anmeldung).
6.
+1 Sehr wahr, mein Fehler.
Jwbensley
2
Was ist mit Sicherheit, Mann in der Mitte? Verschlüsselung? Schlüsselaustausch?
Nasir Iqbal
Mosh sieht genial, obwohl leider nicht Port - Forwarding unterstützt noch .
Boann
20

autossh überwacht Ihre Verbindung und stellt die Verbindung wieder her, wenn sie ausfällt . Es ist zuverlässiger als Keepalives. Wenn Sie eine Verbindung zu einer Bildschirmsitzung herstellen, fahren Sie direkt an der Stelle fort, an der Sie die Verbindung getrennt haben (siehe dazu rscreenautossh).

hayalci
quelle
1
Außerhalb eines konfigurierbaren Keep-Alive können Sie sich nicht automatisch wieder mit einer Sitzung verbinden (wonach das OP gesucht hat). Aber autossh kann sehr hilfreich sein für Apps, die SSH-Tunnel, Port-Mapping usw. erfordern.
ives
ja autossh + screen wäre der sweet spot. autossh hat rscreendafür.
Hayalci
Autossh ist besser als Mosh. Ich habe beides benutzt.
Sridhar Sarnobat
Hier ist ein Blog-Beitrag von Jesse Keating über die Verwendung von Autossh mit Bildschirm .
Sampablokuper
12

tmux

Dieser ist ein Klassiker. Verwenden Sie es, wenn Sie die Gefahr haben, die Verbindung zu einem Terminal zu verlieren.

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

Einfach so, du bist wieder in Aktion.

Jacksonkr
quelle
Danke vielmals! Ich habe nach einer Möglichkeit gesucht, dies mit tmux zu tun, da dies für die meisten die bessere Option ist.
CoolOppo
10

Ich würde installieren und starten Bildschirm, um Ihr Problem zu beheben. Auf dem Bildschirm können Sie erneut eine Verbindung zu einer vorherigen Bildschirmsitzung herstellen.

Abgesehen davon können Sie mit screen auch coole Dinge tun, z. B. Ihren Bildschirm teilen, die Konsole anzeigen usw. Weitere Informationen finden Sie hier und hier .

Für den Anfang, wenn Sie getrennt werden, können Sie verwenden

screen -ls

um Ihre Sessions zu sehen und

screen -r ${session} 

Verbindung zu einem getrennten Teilnehmer wiederherstellen.

wzzrd
quelle
4

Wie andere bereits betont haben, ist der Bildschirm im Allgemeinen die beste Lösung dafür und fügt eine Reihe weiterer nützlicher Funktionen hinzu.

Sie können Ihr Profil auf dem Remotecomputer so einrichten, dass es beim Anmelden automatisch gestartet und / oder erneut mit dem Bildschirm verbunden wird. Dadurch müssen Sie nicht mehr den Bildschirm starten, wenn Sie ihn einmal benötigen, da die Verbindung unterbrochen wird.

Siehe http://tlug.dnho.net/?q=node/239 (oder durchsuchen Sie Google nach vielen anderen Beispielen, die auf etwas andere Weise erstellt wurden).

David Spillett
quelle
3

eine modernere Alternative zum Bildschirm, die leider für einige Arten der "Virtualisierung" nicht verfügbar ist (z. B. können Sie in Cygwin "Bildschirm", aber aufgrund des Designs nicht "tmux" verwenden), aber wo immer Sie die Option haben, tmux zu installieren Ich würde dringend empfehlen, sich für diesen Bildschirm zu entscheiden.

cepal
quelle
3

Hier ist eine andere Nicht-Bildschirm-Lösung.

Mit der Kittablage können Sie genau das tun. Sie verfügt über eine Option zum erneuten Verbinden beim Trennen, die nicht im regulären oder Kitt-Modus enthalten ist

https://puttytray.goeswhere.com/

Es handelt sich um eine (vollständig Open Source) Auswahl an Kitt mit anderen Optionen. Wechseln Sie zu den Verbindungseinstellungen, und es gibt zwei Optionen, eine für "Versuch, bei Verbindungsfehlern erneut eine Verbindung herzustellen" und eine für "Versuch, bei Start erneut eine Verbindung herzustellen".

Munkiepus
quelle
1
Ehh. Wird es zufällig mit einem Keylogger und einem Dienstprogramm zur automatischen PPK-Exfiltration geliefert?
Deer Hunter
1
Ich nehme an, Sie fragen, ob es irgendwie Ihre Daten stiehlt, es ist vollständig Open Source, der Quellcode ist auf github verfügbar, wenn Sie sich dessen github.com/FauxFaux/PuTTYTray ansehen möchten. Es gibt einige Mitwirkende: )
munkiepus
Prost
2

Während der Bildschirm Ihre Shell-Sitzung auf dem Remote-Server geöffnet hält, wenn Ihre SSH-Sitzung unterbrochen wird, kann das Problem des Ausfalls von SSH-Verbindungen nicht behoben werden. Versuchen Sie, wie von zero_r vorgeschlagen, Ihre ssh-Verbindung mit Keep Alives und langen Timeouts zu optimieren.

Ich schlage vor, dass Sie die Ursache der verlorenen Pakete, die die Probleme verursachen, aufspüren und beheben, anstatt sie zu umgehen.

David
quelle
Danke für den Vorschlag. Wir arbeiten daran, das Grundproblem des Paketverlusts aufzuspüren. Es dauert einfach eine Weile, es herauszufinden (sehr schwierig, dieses!). Dies ist wirklich ein Workaround für diese Problemperiode. Man weiß nie, wann etwas eine unterbrochene Verbindung verursacht.
palehorse
1
Es wird viel Rauschen erzeugen, aber Sie können versuchen, ssh durch strace zu führen und zu sehen, was es tut / meldet, wenn die ssh-Verbindung unterbrochen wird. Es könnte nur berichten, was Sie bereits wissen, aber wer weiß ...
David
1

Manchmal vergaß ich auch den Bildschirm zu starten und verlor meine unvollendete Arbeit. In diesem Fall können wir zwar keine unterbrochene SSH-Sitzung wiederherstellen, aber das Reparieren eines ausgeführten Programms auf einem neuen Terminal und die Wiederaufnahme Ihrer Arbeit ist dank weiterhin möglich reptyr.

Nach dem versehentlichen Trennen der Verbindung zu einer SSH-Sitzung muss zuerst ausgeführt werden, screendamit die Verbindung nicht erneut unterbrochen wird. Führen Sie dann in der neuen Sitzung ps aux | grep {The process to be resumed}den Befehl aus, um die PID abzurufen. Mit der PID können Sie versuchen reptyr {PID}oder reptyr -T {PID}(falls es Unterprozesse gibt) die Arbeit fortzusetzen.

march_happy
quelle