Terminal hängt, wenn die Verbindung unterbrochen und ssh eingeschaltet ist

18

Wenn ich auf einem Gnome-Terminal-Tab über das Internet zu einem Server sshe und die Internetverbindung verliere, bleibt der Terminal-Tab hängen und akzeptiert keine Eingaben. Warum hängt es?

Gibt es eine Möglichkeit, die Registerkarte "Terminal" zu aktivieren, dh den lokalen Shell-Prozess weiter auszuführen?

Ist das Schließen des Terminals die einzige Möglichkeit?

Tim
quelle

Antworten:

20

Die SSH-Verbindung wird nach einem bestimmten Zeitraum, der von ClientAliveIntervalund ClientAliveCountMaxParametern und deren clientseitigen Entsprechungen festgelegt wurde, automatisch getrennt . Wenn diese Zeitüberschreitungen ziemlich hoch sind, tritt eine gefrorene Shell auf. Wenn Sie jedoch verwenden, müssen OpenSSHSie nicht auf eine Zeitüberschreitung warten und können mithilfe von Escape-Zeichen das Schließen einer Verbindung erzwingen :

ESCAPE CHARACTERS
When a pseudo-terminal has been requested, ssh supports a number
of functions through the use of an escape character.  A single
tilde character can be sent as ~~ or by following the tilde by a
character other than those described below. The escape character
must always follow a newline to be interpreted as special. The
escape character can be changed in configuration files using the
EscapeChar configuration directive or on the command line by the
-e option.
The supported escapes (assuming the default ‘~’) are:

~.
    Disconnect.
(...)

Wenn die Verbindung nicht mehr reagiert, drücken Sie ~(dh Shift+ `Tasten gleichzeitig), lassen Sie sie los und drücken Sie .. Wenn Sie mit einer instabilen Verbindung arbeiten oder die ganze Zeit über eine Verbindung zum Remote-Server benötigen, können Sie autossh verwenden , um die verlorene Verbindung automatisch zu erneuern. Dies ist sehr praktisch.

EDIT :

Wenn jedoch beide ClientAliveIntervalund ServerAliveIntervalexplizit auf 0 festgelegt sind oder nicht explizit festgelegt sind und dann gemäß den Hilfeseiten sshd_configund standardmäßig auf 0 festgelegt sind ssh_config, werden die Timeout-Einstellungen in den folgenden Dateien festgelegt (von http://tldp.org/HOWTO/TCP- Keepalive-HOWTO / usingkeepalive.html ):

  # cat /proc/sys/net/ipv4/tcp_keepalive_time
  7200

  # cat /proc/sys/net/ipv4/tcp_keepalive_intvl
  75

  # cat /proc/sys/net/ipv4/tcp_keepalive_probes
  9

  The first two parameters are expressed in seconds, and the last is
  the pure number. This means that the keepalive routines wait for
  two hours (7200 secs) before sending the first keepalive probe,
  and then resend it every 75 seconds. If no ACK response is
  received for nine consecutive times, the connection is marked as
  broken.

Sie können diese 3 Dateien ändern, indem Sie einfach Folgendes verwenden echound sich davon überzeugen, dass eine eingefrorene SSH-Sitzung gemäß diesen Werten getrennt wird.

Arkadiusz Drabczyk
quelle
6
Ich möchte hinzufügen, dass ssh das Escape-Zeichen nur anfangs oder nach einem Enter erkennt. Wenn eine SSH-Verbindung hängen bleibt, ist die Eingabetaste häufig, aber nicht immer das letzte Zeichen, das Sie zuvor gedrückt haben. Daher ist es wahrscheinlich besser, sich an Enter ~ .die Sequenz zu gewöhnen , die die Verbindung beendet.
Egmont
Vielen Dank. Mir ist immer noch nicht klar, wie /proc/sys/net/ipv4/tcp_keepalive*Dateien und ClientAliveIntervalund ServerAliveInterval zusammenarbeiten? Sind sie alle für die gleichen Einstellungen, dh um die SSH-Verbindung am Leben zu erhalten? Sind die früheren Dateien nicht nur für SSH-Verbindungen, sondern auch für andere TCP-Verbindungen?
Tim
Eine andere Frage: warum "Wenn diese Zeitüberschreitungen ziemlich hoch sind, werden Sie eine gefrorene Schale erleben." Was meinst du mit "Auszeiten sind ziemlich hoch"? Ist die Schale nicht immer eingefroren, wenn für den angegebenen Zeitraum keine Aktivität erfolgt? oder meinst du, bei einigen fällen von fehlender aktivität wird die shell nicht eingefroren sondern automatisch beendet?
Tim
@ Tim: 1. /proc/sys/net/ipv4/tcp_keepalive*sind nicht nur für, ssh(d)sondern wie es in dem Dokument heißt, das ich verlinkt habe:Remember that keepalive support, even if configured in the kernel, is not the default behavior in Linux. Programs must request keepalive control for their sockets using the setsockopt interface. There are relatively few programs implementing keepalive, but you can easily add keepalive support for most of them following the instructions explained later in this document.
Arkadiusz Drabczyk
@Tim: 2. Ganz hoch bedeutet zum Beispiel 2 Stunden - Sie müssen 2 Stunden warten, bevor die Sitzung getrennt wird. Machen Sie einen Test - stellen Sie eine Verbindung mit einem Remote-Host her, beenden Sie sshddie Remote-Verbindung oder entfernen Sie ein Kabel, und überprüfen Sie, wann eine eingefrorene ssh Sitzung von selbst beendet wird. Mit " frozen shellShell" meine ich eine Shell, die inaktiv ist, keine Schlüssel entgegennimmt und nichts druckt.
Arkadiusz Drabczyk