ServerAliveInterval : liczba sekund, które klient będzie czekał przed wysłaniem pakietu zerowego na serwer (aby utrzymać połączenie przy życiu).
ClientAliveInterval : liczba sekund, przez którą serwer będzie czekał przed wysłaniem pakietu zerowego do klienta (aby utrzymać połączenie przy życiu).
Ustawienie wartości 0 (domyślnie) spowoduje wyłączenie tych funkcji, więc połączenie może zostać zerwane, jeśli będzie zbyt długo bezczynne.
ServerAliveInterval wydaje się być najczęstszą strategią utrzymywania połączenia przy życiu. Aby zapobiec problemowi z uszkodzoną rurą, oto konfiguracja ssh, której używam w moim pliku .ssh / config:
Host myhostshortcut
HostName myhost.com
User barthelemy
ServerAliveInterval 60
ServerAliveCountMax 10
Powyższe ustawienie będzie działać w następujący sposób:
- Klient będzie czekał bezczynnie przez 60 sekund (czas ServerAliveInterval), a następnie wyśle do serwera „zerowy pakiet zerowy” i oczekuje odpowiedzi. Jeśli nie otrzyma żadnej odpowiedzi, będzie próbować powyższego procesu aż do 10 (ServerAliveCountMax) razy (600 sekund). Jeśli serwer nadal nie odpowiada, klient rozłącza połączenie ssh.
ClientAliveCountMax po stronie serwera może również pomóc. Jest to limit czasu, przez jaki klient może pozostawać bez odpowiedzi przed rozłączeniem. Wartość domyślna to 3, jak w trzech ClientAliveInterval.
Jest to wyjaśnione w
sshd_config
manual (man sshd_config
):Aby zapoznać się z opcjami klienta, zobacz wyjaśnienie w
man ssh_config
:W oparciu o powyższe 0 oznacza, że jest wyłączone. Dlatego należy ustawić te wartości na tyle, aby uniknąć błędu Broken pipe .
źródło
ServerAliveInterval
w pliku konfiguracyjnym.Odpowiedź Barthelemy jest fajna, ale tak naprawdę nie dochodzi do sedna problemu. Zawieszasz komputer i chcesz, aby sesja SSH nadal działała podczas uruchamiania komputera.
Nie ma takiej konfiguracji dla ssh, która utrzymywałaby połączenie w ten sposób. SSH używa TCP, na początek potrzebujesz trójdrożnego uzgadniania, a następnie utrzymuj się przy życiu po pewnym czasie bezczynności. Po wyłączeniu / hibernacji wszystkie połączenia TCP są zamykane za pomocą FIN. Nie da się tego pokonać.
Aby uzyskać brudne obejście, możesz użyć VPS lub innego urządzenia online z ekranem, aby zachować połączenie. Moja rada nie rób tego ze względów bezpieczeństwa.
źródło
Ponieważ nie możesz zagwarantować, że połączenie SSH (będące TCP) pozostanie aktywne, gdy jeden koniec przestanie wysyłać ACK do otrzymanych pakietów, osobiście korzystam z http://www.harding.motd.ca/autossh/, aby zrestartować wszystkie moje połączenia SSH prawie jak tylko się zawieszam.
Ponieważ GNU Screen będzie używany po stronie serwera, ponowne podłączenie prowadzi mnie tam, gdzie byłem wcześniej.
Możesz mieć nasłuchiwanie na dodatkowych portach, aby stale sprawdzać, czy połączenia są nadal aktywne, ale osobiście uważam, że działa wystarczająco dobrze z tym wyłączonym i polegając tylko na własnym SSH
ServerAliveInterval
/ServerAliveCountMax
.Inną opcją jest http://mosh.mit.edu/, która wykorzystuje UDP i bezproblemowo odzyskuje po długotrwałym braku łączności.
źródło
Możesz także uruchamiać polecenia,
nohup
jeśli chcesz, aby były uruchamiane niezależnie od połączenia SSH.na przykład
$ nohup tar -xzf some_huge.tar.gz &
&
Jest, jak sądzę, nie jest konieczne, ale jest wygodne, ponieważ to sprawia, przebiegu procesu w tle, dzięki czemu można robić inne rzeczy.Zawsze używam nohup do każdego procesu, który zajmuje trochę czasu, więc nie muszę zaczynać od nowa, jeśli stracę połączenie z jakiegokolwiek powodu - przerwa w zasilaniu (w mojej zdalnej lokalizacji, oczywiście nie na hoście), przerwa w sieci, cokolwiek.
źródło
zsh
użytkownicy powinni trzymać siędisown -h
zamiastnohup
, chyba że problem został rozwiązany od tego czasu.Umieść swoją długotrwałą sesję na ekranie Zobacz szczegóły na ekranie -h
W ten sposób możesz ponownie połączyć się z maszyną za pomocą ssh i ponownie podłączyć się do sesji ekranowej
źródło