In einer unzuverlässigen WLAN-Umgebung muss ich oft über ssh eine Verbindung zu einem Server herstellen. Auf dem Server führe ich den Bildschirm aus. Wenn die Verbindung getrennt wird, kann ich die Bildschirmsitzung wieder herstellen und fortsetzen und dort weitermachen, wo ich aufgehört habe. Der Verbindungsverlust ist jedoch immer noch eine große Zeitsenke: Wenn die Verbindung unterbrochen wird, während ich abbrich bin auf dem Server, neigt das Terminalfenster zum Einfrieren. Ich muss diese Registerkarte beenden, eine neue öffnen, ssh erneut auf den Server übertragen und die Bildschirmsitzung fortsetzen. Ich habe dies mit dem Ausführen von Bildschirm auf dem Server und Bildschirm lokal versucht. In beiden Fällen kann es zum Einfrieren kommen, wenn die Verbindung unterbrochen wird.
Gibt es eine Möglichkeit, wie ich es mit dem Bildschirm oder dem Bildschirm selbst tun kann, bei der automatisch versucht wird, die Verbindung wiederherzustellen und die Sitzung aufrechtzuerhalten, sodass ich die Verbindung nicht manuell wiederherstellen muss? Oft, wenn ich die Verbindung verliere, denke ich, dass es nur für eine sehr kurze Zeit ist - vielleicht weniger als eine Sekunde.
Ich benutze Ubuntu 14.04 LTS, MATE Edition. Vielen Dank
quelle
<Enter>
und geben Sie ein~.
, um Ihre Seite anzuweisen, die Verbindung zu trennen, und wiederholen Sie einfach den letzten ssh-Befehl, um die Verbindung wiederherzustellen (z. B. mit dem Aufwärtspfeil oder!!
).Antworten:
Sie können sich Folgendes ansehen
mosh
: https://mosh.org/Sie können einen Jump-Server mit einer zuverlässigen Internetverbindung einrichten, mit dem Sie
mosh
eine Verbindung herstellen, und dannssh
Sitzungen mit jedem von Ihnen verwalteten Server durchführen. Der Grund, warum ich die Verwendung eines Jump-Servers vorschlage, ist, dass Sie möglicherweise nichtmosh
auf den von Ihnen verwalteten Servern installieren möchten .Ein weiterer Vorteil von
mosh
ist, dass es auf UDP anstatt auf TCP basiert und Ihre Sitzung eine Änderung der IP-Adresse überstehen kann, zum Beispiel von WiFi zu einer mobilen Internetverbindung.Nur um es klar zu machen,
mosh
ist dies kein Ersatzscreen
, sondern vielmehrssh
. Es ist immer noch eine gute Idee, sie zu verwendenscreen
, da siemosh
selbst keine Möglichkeit bietet, die Verbindung zu Ihrer Sitzung wiederherzustellen, wenn der Client aus irgendeinem Grund stirbt.quelle
Ich benutze es
tmux
seit einigen Jahren und meiner Erfahrung nach stellt es die Verbindung automatisch wieder her. Zumindest dann, wenn die Verbindung nur für relativ kurze Zeit ausfällt. Beachten Sie, dass ich eigentlichbyobu
mit tmux als Backend verwende. Ich weiß nicht , ob diese Robustheit ein Merkmal isttmux
oderbyobu
oder sogar von der Kombination der beiden, aber ich schlage vor , Sie geben sowohl einen Versuch.Ich verbinde mich von meiner lokalen Arch-Installation über ein VPN mit verschiedenen entfernten Ubuntu-Servern. Ich habe es gerade getestet, indem ich mein Netzwerkkabel abgezogen habe, während ich mit der Fernbedienung verbunden war. Die Sitzung wurde unterbrochen, aber sobald mein Kabel wieder eingesteckt war, wurde sie nahtlos fortgesetzt.
Als ich meinen Router durch einen Neustart testete, kehrte die Verbindung jedoch nicht zurück. Ich nehme an, es hat etwas damit zu tun, wie lange das Netzwerk ausgefallen ist, aber es scheint sich wieder zu verbinden, wenn es nur ein paar Sekunden ausgefallen ist.
Wenn es relevant ist, mache ich das alles mit
terminator
meinem Terminal-Emulator.Alle drei sind in den Ubuntu-Repositories verfügbar:
Ich bin aber ganz sicher nicht , dass entweder
tmux
oderbyobu
besser bei ssh Abschaltungen Handhabung. Ich weiß nur, dass sie meiner Erfahrung nach häufig von kurzen Verbindungsverlusten herrühren. Das kann aber auch an anderen Aspekten meiner Konfiguration liegen.quelle
tcp
Verbindung unterbrochen wurde . Meiner Erfahrung nachssh
kann dies bei zeitweiligen Netzwerkausfällen sehr belastbar sein. Ich glaube nicht, dass dies mit der Tatsache zu tun hat, dass Sietmux
innerhalb desssh
Fensters arbeiten.ClientAlive
/ServerAlive
löst aus, oder ... Ich habe jedoch keine Ahnung, wasbyobu
passiert .tmux
ist im Grunde eine modernere Alternative zuscreen
, ja. Als ich anfing, so zu arbeiten, wie ich es jetzt tat und so etwas brauchte, schlug meine flüchtige Lektüre vor, dasstmux
dies heutzutage die bessere Wahl ist. Ich bin mir auch nicht hundertprozentig sicher, dass es eine bessere Verwaltung verlorener Verbindungen bietet. Ich weiß nur, dass es sich von kurzen Ausfällen erholt, die ich erlebt habe. Ob das antmux
etwas anderem liegt, weiß ich nicht. Aber es scheint einen Versuch wert :). Byobu ist im Grunde ein Frontend für screen / tmux, kein GUI-Terminal-Emulator. Es ist jedoch äußerst nützlich: byobu.orgVerwenden Sie die
ServerAlive
Optionen von ssh, um festzustellen, wann die Verbindung fehlgeschlagen ist.Wenn Sie also
ServerAliveInterval
5 einstellen ,ssh
wird die Verbindung automatisch getrennt, wenn das Netzwerk für 15 Sekunden unterbrochen wird.quelle
~.
(oder zuerst eingeben, dann~.
) , bestehend aus: Escape - Zeichen~
und dem Befehl , um die Sitzung zu brechen.
Unter ähnlichen Bedingungen verwende ich
eshell
TRAMP (über ssh) in Emacs. TRAMP sorgt dafür, dass die Verbindung bei Bedarf wiederhergestellt wird, ohne dass ich große Probleme damit habe, die gewünschten Befehle für die Remote-Shell zu geben.Eshell eignet sich jedoch nicht als Terminal, dh zum Ausführen von Befehlen, die mit dem Terminal etwas Besonderes tun, oder zum kontinuierlichen (inkrementellen) Ausdrucken über einen längeren Zeitraum.
Grundsätzlich ist es ziemlich einfach, mit TRAMP in Emacs damit zu beginnen:
quelle
Haftungsausschluss
Wenn Ihre SSH-Verbindung einen kurzen Netzwerkausfall nicht übersteht, lässt TCP etwas anderes nicht zu
ssh
.Siehe unten für Details. Sowieso:
Die schnellste und schmutzigste Lösung ohne Abhängigkeiten
Erstellen Sie ein Shell-Skript wie folgt:
Dies führt nur eine dumm-einfache Schleife aus, mit der versucht wird, eine Verbindung
ssh
herzustellen und eine Verbindung herzustellenscreen
. Übergeben Sie den Host oder was auch immer Sie normalerweisessh
als Befehlszeilenargumente an Ihren Aufruf übergeben würden.Die erneute Verbindung basiert lediglich darauf, ob SSH einen Fehler bei der Verbindung meldet, was bedeutet, dass es keine Intelligenz zum Erkennen von Nicht-SSH-Fehlern wie "Sie haben WiFI buchstäblich nicht aktiviert" oder was auch immer hat, aber das spielt wahrscheinlich keine Rolle Sie
Ich gehe davon aus, dass Sie über
ssh-agent
einen SSH-Schlüssel ohne Passphrase verfügen , mit dem eine erneute Verbindung ohne zusätzliche Eingaben von Ihnen hergestellt werden kann.Es wird eine winzige Racebedingung geben, bei der Sie, wenn Sie
^C
während eines erneuten Verbindungsaufbaus genau den richtigen, von Menschen nicht wahrnehmbaren Sekundenbruchteil treffen , das Skript beenden können, anstatt die Verbindung^C
zum Client-Terminal weiterzuleiten Zerdrücke nicht^C
zu eifrig.Einfachste zusätzliche Softwarelösung
Sie können das Programm autossh ausprobieren , das in Ihrem Ubuntu-Paket-Repository verfügbar sein sollte.
Wenn Sie es aus dem Quellcode erstellen oder prüfen müssen, handelt es sich um ein einzelnes C-Programm, das ohne zusätzliche Bibliotheken als Abhängigkeiten kompiliert wird, mehr Informationen zur Überprüfung der Verbindungsbelebung zu haben scheint als mein Hack oben, und es wird auch mit einem praktischen
rscreen
Skriptbefehl ausgeliefert, der auto -anhängt anscreen
.Einzelheiten
Wie
ssh
normal erholtNur zur Überprüfung, da ich Dinge nicht gerne sage, ohne mich selbst zu überprüfen, habe ich einen kleinen Test durchgeführt, bevor ich antwortete:
Ich habe mit einem Linux-Gerät auf mein WLAN zugegriffen, eine SSH-Verbindung zu einem anderen Gerät in meinem LAN hergestellt, überprüft, ob ich eine funktionierende
ssh
Verbindung zum anderen Ende habe (Befehle ausführen usw.), und dann auf dem Client das WLAN getrennt (wodurch die Schnittstelle verursacht wurde) zu dekonfigurieren: keine IP-Adressen mehr), ein paar weitere Zeichen in die ssh-Sitzung eingegeben (natürlich keine Antwort) und dann erneut mit meinem WLAN verbunden - die erneute Verbindung schlug mindestens einmal aufgrund eines schlechten Signals und anderer Faktoren fehl , dann endlich wieder verbunden: Ich wartete ungefähr fünf Sekunden,ssh
bis sich die Sitzung erholte, nichts geschah, also drückte ich eine weitere Taste, und diessh
Sitzung wurde sofort wieder lebendig, wobei alle Tasten, die ich während der Trennung eingegeben hatte, in der Befehlszeile angezeigt wurden.Sehen Sie,
ssh
schreiben / lesen Sie einfach in den TCP-Netzwerk-Socket, bis das Betriebssystem meldet, dass ein Fehler aufgetreten ist, und TCP ist tatsächlich sehr tolerant gegenüber längeren Verbindungsabbrüchen.Wenn der TCP-Stack in Linux mit den Standard-Kernel-Einstellungen auf seine eigenen Geräte gestellt ist, toleriert er es, dass die Verbindung viele Minuten lang völlig still ist, bevor er die Verbindung für tot erklärt und einen Fehler meldet
ssh
- bis es endgültig aufgibt, reden wir im Ballpark von ~ 30 Minuten, oder zumindest mit Sicherheit lang genug, um Verbindungsprobleme von einer Sekunde oder einer Minute Dauer zu überstehen.Im Hintergrund versucht der Linux-TCP-Stack nach und nach, Nachrichten mit immer längeren Verzögerungen erneut abzurufen. Dies bedeutet jedoch, dass Sie möglicherweise eine zusätzliche Verzögerung feststellen, bevor Ihre
ssh
Sitzung wieder "lebendig" zu werden scheint.Warum das manchmal kaputt geht
Häufig wird die Verbindung nach einer erheblich kürzeren Inaktivitätsdauer als der vom TCP-Stack tolerierten Zeitspanne aktiv geschlossen, und der Verbindungsstatus wird dann nicht an Ihren
ssh
Client gemeldet .Mögliche Kandidaten sind:
Firewalls oder NAT'ing-Router, die Speicher benötigen, um sich an jede Live-TCP-Verbindung zu erinnern - als Optimierung und als Abwehrmaßnahme gegen DOS-Angriffe vergessen sie manchmal einfach Ihre Verbindung und ignorieren dann automatisch die darauf folgenden Pakete, da Pakete in der mitten in einer Verbindung, wenn Sie sich nicht erinnern, dass die bestehende Verbindung ungültig ist.
Besser funktionierende Firewalls / Router injizieren ein TCP-RST-Paket, das normalerweise als
connection reset by peer
Fehlermeldung angezeigt wird. Das zurückgesetzte Paket ist jedoch ein "Fire-and-Forget" -Paket. Wenn also in diesem Moment die Verbindung zu Ihrem Client weiterhin Probleme aufweist, wird das TCP-RST-Paket gelöscht Paket auch zurücksetzen, Ihr Client wird denken, dass die Verbindung noch besteht.Der Server selbst verfügt möglicherweise über eine Firewall-Richtlinie, mit der unerwartete Pakete stillschweigend verworfen werden. Dadurch werden die Verbindungswiederaufnahmeversuche des Clients abgebrochen, wenn der Server denkt, dass die Verbindung geschlossen ist, der Client jedoch nicht: Ihr Client versucht weiterhin, die Verbindung fortzusetzen, der Server jedoch Ignorieren, da es keine Live-Verbindung gibt, zu der diese Pakete im Firewall-Status des Servers gehören.
Da Sie Linux verwenden, prüfen Sie sorgfältig, ob Ihr Server
iptables
/ip6tables
(odernft
ob Sie das neue Material verwenden) genau das zulässt, was Sie zulassen, oder nicht. Es ist üblich, neue / eingerichtete / verwandte Pakete auf dem TCP-SSH-Port zuzulassen , aber keine "ungültigen". Wenn Sie im Hintergrund alles ablegen, was nicht zulässig ist, kann dieses übliche Setup nach kurzen Verbindungsproblemen zu solchen Einfrierungen führen .Ihr SSH-Server selbst ist möglicherweise so konfiguriert, dass die Verbindung nach einer gewissen Zeit der Inaktivität geschlossen wird, indem Sie eine der OpenSSH-Optionen für Keepalive-Pakete für TCP- oder SSH-Clients verwenden. An sich führt dies nicht zu unbestimmten Hängen, aber es kann Sie in einen der oben beschriebenen Zustände versetzen.
Es ist möglich, dass Sie ihm nicht genug Zeit geben, um sich von selbst zu lösen, nachdem Sie in den Zustand gekommen sind, in dem Ihre
ssh
Sitzung aufgelegt hat.quelle