So vermeiden Sie das Timeout der SSH-Verbindung und das Einfrieren des GNOME-Terminals

235

Wenn ich über ssh eine Verbindung zu bestimmten Servern herstelle, kommt es zu einem Timeout und "friert" das Terminal ein (akzeptiert keine Eingaben, trennt die Verbindung nicht, kann nicht mit Strg-C den ssh-Prozess beenden oder so).

Dies ist in Ubuntu der gnome-terminalFall , obwohl es den Ein- / Ausgang des Terminals anzuhalten scheint und den Betrieb der GNOME-Terminal-Software selbst nicht beeinträchtigt. Also weniger ein Bug mit gnome-terminalals eine nervige Inkonsistenz mit ssh.

Gibt es eine Möglichkeit, das Terminal von SSH-Verbindungen, deren Zeitüberschreitung abgelaufen ist, abzuhalten bzw. wiederzugewinnen?

Kzqai
quelle

Antworten:

256

sshd (der Server) beendet die Verbindung, wenn er eine Weile nichts vom Client hört. Sie können Ihren Client anweisen, von Zeit zu Zeit ein Lebenszeichensignal an den Server zu senden.

Die Konfiguration hierfür befindet sich in der Datei ~/.ssh/config. Um das Signal alle vier Minuten an den Remote-Host zu senden, geben Sie Folgendes in Ihr Feld ein ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

Das habe ich in meinem ~/.ssh/config.

Um es für alle Hosts zu aktivieren, verwenden Sie:

Host *
  ServerAliveInterval 240

Stellen Sie außerdem sicher chmod 600 ~/.ssh/config, dass Sie das Programm ausführen , da die Konfigurationsdatei nicht für die ganze Welt lesbar sein darf.

Ludwig Weinzierl
quelle
1
Vielen Dank, sblair, dass Sie mir bei der Formulierung geholfen haben. Es wird sehr geschätzt. Ich habe "sollte nicht" zurück zu "darf nicht" geändert, da ssh die Berechtigungen der Datei überprüft und fehlschlägt, wenn sie in der Welt oder in einer Gruppe lesbar ist.
Ludwig Weinzierl
1
Das hat das OP nicht verlangt. Er wird nicht wegen Untätigkeit angepfiffen. Er versucht eine Verbindung herzustellen und sein Terminal friert ein.
Cerin
Wo ist das ~/.ssh/config?
Benutzer
1
@ Benutzer '~ /' steht für Ihren Basisordner. '.ssh' ist ein Ordner in Ihrem Home-Ordner.
wkm
6
Dies ist nutzlos, wenn Ihre Verbindung tatsächlich verloren geht ...
so12311
248

Drücken Sie Enter, ~, .eine nach der anderen aus einem gefrorenen Sitzung zu trennen.

Der Abschnitt "ESCAPE CHARACTERS" in der SSH-Manpage erläutert die zugrunde liegenden Details.

Peter Eisentraut
quelle
40
Diese Antwort scheint mir die Frage genauer zu beantworten und war auf jeden Fall die Antwort, nach der ich gesucht habe.
CoatedMoose
Beachten Sie, dass Sie die Zeile EscapeChar ~in auskommentieren müssen /etc/ssh/ssh_config(oder ~/.ssh/ssh_configwenn Sie es vorziehen).
Aditya MP
@adityamenon Nein, EscapeChar ~ist bereits die Standardeinstellung.
Peter Eisentraut
2
@Mark die frage fragt "gibt es eine möglichkeit zu verhindern, dass das terminal von ssh verbindungen , die abgelaufen sind, wiedererlangt wird ?" Betonung meiner.
CoatedMoose
2
Auch wenn es im Zusammenhang mit der Frage falsch war, ist es genau das, was ich wollte.
Subin Sebastian
38

Auch wenn dies keine direkte Antwort auf Ihre Frage ist, hängt es stark mit dem Problem zusammen, das Sie haben. Anstatt die Verbindung aufrecht zu erhalten (alle Verbindungen schließlich sterben) zu halten versuchen , können Sie Terminal - Multiplexern verwenden, wie screenund tmuxdass die Sitzung am Leben im Hintergrund halten , auch wenn Ihr Endgerät getrennt wird.

Im Wesentlichen führen Sie beim Anmelden am SSH-Server sofort Folgendes aus, screenwodurch eine neue Sitzung erstellt und angehängt wird:

$ screen

Dann arbeiten Sie wie gewohnt mit der Shell. Wenn nun die Verbindung getrennt wird und Sie über SSH wieder online gehen und eine Verbindung zum Server herstellen können, erhalten Sie eine Liste der aktuellen Sitzungen mit:

$ screen -ls

So ordnen Sie eine Sitzung erneut zu:

$ screen -r <session>

wo <session>ist die PID oder ein Sitzungsname. Sie werden wieder mit Ihrer Sitzung verbunden und können dort weitermachen, wo Sie aufgehört haben!

Sie können die Sitzung sogar trennen und die Verbindung von zu Hause aus wiederherstellen, um genau an dem Punkt fortzufahren, an dem Sie aufgehört haben. So trennen Sie die Sitzung, die Sie verwenden, C-agefolgt von C-d(das ist Control + Aund dann Control + D).

Es gibt auch ein einfaches Online-Tutorial .

Die Verwendung von screenund tmuxauf Remoteservern wird als bewährte Methode angesehen und dringend empfohlen . Einige screenBenutzer gehen so weit, dass sie als Standard-Anmeldeshell festgelegt sind. Wenn sie eine Verbindung herstellen, starten sie sofort eine neue screenSitzung.

fotos
quelle
2
Eine andere Alternative ist die Verwendung von mosh: mosh.mit.edu
Zombies
Dies ist besonders nützlich, wenn Sie einen Hotspot oder WLAN verwenden, der gelegentlich ausfällt.
Randall
11

Versuchen Sie -o ServerAliveInterval=30an Ihre Verbindungszeichenfolge anzuhängen ( 30bedeutet 30 Sekunden und kann natürlich angepasst werden)

Fergie
quelle
5

Sie können auch ein Zeitlimit für Inaktivität auf der SSH-Serverseite festlegen:

Datei: /etc/ssh/ssh_config

Inhalt:

ClientAliveInterval XX
ClientAliveCountMax YY

Dies funktioniert genauso wie die Client-Einstellung, jedoch werden Null-Pakete nicht vom Client, sondern vom Server gesendet.

Herausgefiltert aus:

http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html

Ladinfremes
quelle
1

Für Menschen, die verhindern möchten, dass der Kunde eine Zeitüberschreitung erleidet.

Sie könnten versuchen, ConnectTimeout 0in der Konfigurationsdatei einzustellen . Der Wert 0 bedeutet, dass die Verbindung auf unbestimmte Zeit bestehen bleibt, sofern sie nicht geschlossen wird.

Ihre Konfigurationsdatei (oder ssh_config) könnte folgendermaßen aussehen:

Host *
   ConnectTimeout 0
Yohannes Libanos
quelle