terminal zawiesza się, gdy utracone połączenie i ssh jest włączony

18

kiedy ssh do serwera przez Internet w zakładce terminalu gnome, jeśli stracę połączenie internetowe, zakładka terminalu zostanie zawieszona i nie przyjmie żadnych danych wejściowych. Dlaczego jest zawieszony?

Czy jest jakiś sposób na aktywację zakładki terminalu, tzn. Sprawienie, aby kontynuowała uruchamianie lokalnego procesu powłoki?

Czy zamknięcie karty terminala jest jedynym sposobem?

StackExchange dla wszystkich
źródło

Odpowiedzi:

20

Połączenie SSH spada automatycznie po upływie określonego okresu czasu przez zestaw ClientAliveIntervali ClientAliveCountMaxparametrów oraz ich odpowiedniki po stronie klienta. Jeśli limity czasu są dość wysokie, pojawi się zamrożona skorupa. Jeśli jednak skorzystasz OpenSSH, nie musisz czekać na przekroczenie limitu czasu i możesz wymusić zamknięcie połączenia za pomocą znaków zmiany znaczenia :

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.
(...)

Gdy połączenie się zawiesi, naciśnij ~(to znaczy Shift+ `klawisze razem), zwolnij i naciśnij .. Alternatywnie, jeśli pracujesz z niestabilnym połączeniem lub musisz być podłączony do zdalnego serwera przez cały czas, możesz użyć autossh do automatycznego odnowienia utraconego połączenia, jest to bardzo wygodne.

EDYCJA :

Jednakże, jeśli obie ClientAliveIntervali ServerAliveIntervalsą ustawione na 0 w sposób wyraźny lub nie są jawnie, a następnie są ustawione na 0 domyślnie według sshd_configi ssh_configstrony podręcznika, ustawienia czasu oczekiwania są ustawione w następujących plikach (od 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.

Możesz zmodyfikować te 3 pliki za pomocą echoi przekonać się, że zamrożona sesja SSH jest rozłączana zgodnie z tymi wartościami.

Arkadiusz Drabczyk
źródło
6
Chciałbym dodać, że ssh rozpoznaje znak ucieczki tylko na początku lub po Enter. Kiedy połączenie ssh zostaje zablokowane, Enter jest często, ale nie zawsze, ostatnim naciśniętym znakiem. Prawdopodobnie lepiej więc przyzwyczaić się do Enter ~ .sekwencji kończącej połączenie.
egmont
Dzięki. Nadal nie jestem pewien, jak /proc/sys/net/ipv4/tcp_keepalive*pliki ClientAliveIntervali ServerAliveInterval współpracują ze sobą? Czy wszystkie mają takie same ustawienia, tj. Utrzymują połączenie ssh przy życiu? Czy poprzednie pliki są nie tylko dla połączeń ssh, ale także dla innych połączeń TCP?
StackExchange dla wszystkich
Kolejne pytanie: dlaczego „Jeśli limity czasu są dość wysokie, doświadczysz zamrożonej skorupy”. Co rozumiesz przez „przekroczenia limitu czasu”? Czy skorupa nie zawsze jest zamrożona, jeśli brak aktywności przez określony czas? czy masz na myśli, że w niektórych przypadkach braku aktywności skorupa nie zostaje zamrożona, ale kończy się automatycznie?
StackExchange dla wszystkich
@ Czas: 1. /proc/sys/net/ipv4/tcp_keepalive*są nie tylko, ssh(d)ale jak to napisano w dokumencie, do którego linkowałem: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. Dość wysoka oznacza na przykład 2 godziny - musisz poczekać 2 godziny, zanim sesja zostanie rozłączona. Wykonaj test - połącz się ze zdalnym hostem, zabij sshdna pilocie lub odłącz kabel i sprawdź, kiedy zamrożona ssh sesja zakończy się sama. frozen shellRozumiem przez to, że powłoka jest nieaktywna, nie bierze żadnych kluczy i niczego nie drukuje.
Arkadiusz Drabczyk