2010-01-20 23:33:01 +0000 2010-01-20 23:33:01 +0000
236
236

Weg zur Vermeidung von ssh-Verbindungs-Timeout & Einfrieren von GNOME Terminal

Wenn ich mich über ssh mit bestimmten Servern verbinde, kommt es zu Zeitüberschreitungen und das Terminal “friert ein” (nimmt keine Eingaben an, trennt die Verbindung nicht, kann nicht Strg-C drücken, um den ssh-Prozess zu beenden oder so).

Dies ist bei Ubuntu gnome-terminal, obwohl es die Terminal-Eingabe/Ausgabe anzuhalten scheint und die Funktion der GNOME-Terminal-Software selbst nicht beeinträchtigt. Also weniger ein Fehler bei gnome-terminal als eine ärgerliche Inkonsistenz mit ssh.

Gibt es also eine Möglichkeit, das Terminal von ssh-Verbindungen, bei denen die Zeit abgelaufen ist, zu verhindern/zurückzugewinnen?

Antworten (7)

259
259
259
2010-01-20 23:53:48 +0000

sshd (der Server) schließt die Verbindung, wenn er eine Zeit lang nichts vom Client hört. Sie können Ihren Client anweisen, ab und zu ein Lebenszeichen an den Server zu senden.

Die Konfiguration hierfür befindet sich in der Datei ~/.ssh/config. Um das Signal alle vier Minuten an remotehost zu senden, tragen Sie Folgendes in Ihre ~/.ssh/config ein.

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, dass Sie chmod 600 ~/.ssh/config ausführen, da die Konfigurationsdatei nicht weltlesbar sein darf.

250
250
250
2010-01-20 23:44:01 +0000

Drücken Sie nacheinander Enter, ~, ., um die Verbindung zu einer eingefrorenen Sitzung zu trennen.

Der Abschnitt “ESCAPE CHARACTERS” in der Manpage von ssh erklärt die zugrunde liegenden Details.

39
39
39
2012-07-03 01:28:14 +0000

Auch wenn dies keine direkte Antwort auf Ihre Frage ist, ist es sehr verwandt mit dem Problem, das Sie haben. Anstatt zu versuchen, die Verbindung am Leben zu erhalten (alle Verbindungen sterben schließlich), können Sie Terminal-Multiplexer wie screen und tmux verwenden, die die Sitzung im Hintergrund aufrechterhalten, auch wenn Ihr Terminal getrennt wird.

Wenn Sie sich am SSH-Server anmelden, führen Sie im Wesentlichen sofort screen aus, das eine neue Sitzung erstellt und anhängt:

$ screen

Dann machen Sie weiter und arbeiten mit der Shell, wie Sie es normalerweise tun würden. Wenn nun die Verbindung unterbrochen wird und Sie wieder online gehen und sich über SSH mit dem Server verbinden können, erhalten Sie eine Liste der aktuellen Sitzungen mit

$ screen -ls

Um sich wieder mit einer Sitzung zu verbinden:

$ screen -r <session>

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

Sie können sogar die Sitzung trennen und die Verbindung von zu Hause aus wiederherstellen, um genau an der Stelle fortzufahren, an der Sie aufgehört haben. Um die Sitzung zu trennen, verwenden Sie C-a gefolgt von C-d (das heißt Control + A und dann Control + D).

Es gibt auch eine einfache Online-Anleitung .

Die Verwendung von screen und tmux auf entfernten Servern gilt als best practice und wird höchstens empfohlen. Manche Leute gehen sogar so weit, dass sie screen als Standard-Login-Shell haben, so dass sie beim Verbinden sofort eine neue screen-Sitzung starten.

12
12
12
2014-02-06 14:13:27 +0000

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

6
6
6
2016-02-12 22:45:27 +0000

Sie können auch ein Leerlauf-Timeout-Intervall auf der SSH-Serverseite einstellen:

Datei: /etc/ssh/ssh_config

Inhalt:

ClientAliveInterval XX
ClientAliveCountMax YY

Dies funktioniert genau so wie die Client-Einstellung, aber die Null-Pakete werden vom Server und nicht vom Client gesendet.

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

2
2
2
2015-12-17 02:19:43 +0000

Für Leute, die verhindern wollen, dass der Client von vornherein ein Timingout hat.

Sie könnten versuchen, ConnectTimeout 0 in der Konfigurationsdatei zu setzen. Der Wert 0 bedeutet, dass die Verbindung unendlich lange aufrechterhalten wird, bis sie geschlossen wird.

Ihre Konfigurationsdatei (oder ssh_config) könnte wie folgt aussehen:

Host *
   ConnectTimeout 0
0
0
0
2020-01-24 11:55:41 +0000

In meinem Fall lag das Problem in der großen MTU-Größe. Sie können MTU am Router ändern, wenn Sie NAT verwenden, aber ich ändere MTU am Server:

sudo /sbin/ifconfig eth0 mtu 1036
sudo /etc/init.d/networking restart

Unter Windows können Sie auch diesen Schlüssel erhöhen:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpMaxDataRetransmissions"=dword:00000010