Sesje SSH zawieszają się podczas zamykania / ponownego uruchamiania

13

Mam serwer, na którym działa Debian i sshd, a na wypadek konieczności ponownego uruchomienia serwera moja sesja SSH zawiesza się po stronie klienta aż do przekroczenia limitu czasu TCP. Zakładam, sshdże dzieje się tak, ponieważ po zakończeniu nie jawnie zamyka otwartych sesji SSH dla hosta. Co powinienem zrobić, aby sshdnajpierw odłączyć wszystkich, a następnie zakończyć się jak zwykle? Jak dotąd nie widzę parametru man sshd_config, który byłby związany z zachowaniem wyłączania.

Vesper
źródło
1
Gdy wszystko inne zawiedzie, możesz zabić klienta SSH w dowolnym momencie, naciskając [Enter] [~] [.]. Wyjaśnienie, jak faktycznie rozwiązać problem, który się zbliża.
n. 1

Odpowiedzi:

32

Podczas zamykania lub ponownego uruchamiania systemu systemdpróbuje zatrzymać wszystkie usługi tak szybko, jak to możliwe. Obejmuje to wyłączenie sieci i zakończenie wszystkich procesów, które są nadal aktywne - zwykle w tej kolejności. Więc kiedy systemd zabija rozwidlone procesy SSH, które obsługują twoje sesje SSH, połączenie sieciowe jest już wyłączone i nie mają możliwości płynnego zamknięcia połączenia klienta.

Pierwszą myślą może być po prostu zabicie wszystkich procesów SSH jako pierwszy krok podczas zamykania systemu, a jest tam całkiem sporo plików usług systemowych, które właśnie to robią.

Ale jest oczywiście rozwiązanie schludny wygląd (jak to „niby” do zrobienia) systemd-logind.
systemd-logindśledzi sesje aktywnych użytkowników (lokalne i SSH) i przypisuje wszystkie procesy odradzane w nich do tak zwanych „plasterków”. W ten sposób, gdy system zostanie zamknięty, systemd może po prostu SIGTERM wszystko wewnątrz segmentów użytkownika (w tym rozwidlony proces SSH, który przekazuje określoną sesję), a następnie kontynuować zamykanie usług i sieci.

systemd-logindwymaga modułu PAM, aby otrzymywać powiadomienia o nowych sesjach użytkowników, i musisz dbusużyć go loginctldo sprawdzenia jego statusu, więc zainstaluj oba z nich:

apt-get install libpam-systemd dbus

Upewnij się, że /etc/ssh/sshd_configfaktycznie zamierzasz używać modułu UsePAM yes.

n.st
źródło
Ok, cel osiągnięty i dziękuję za wyjaśnienie. (Chociaż chciałbym jakiś sposób kontroli zależności dla zamykania, aby wszystko było najpierw SIGTERM, będąc w stanie zakończyć pracę, może to być rozwiązanie warstwowe.)
Vesper
Z jakiegoś powodu nie otrzymałem powiadomienia o odpowiedzi podczas odwiedzania tylko StackOverflow. Dziwne.
Vesper
1
Krótko mówiąc, aby ogolić się kilka sekund po wyłączeniu, musimy zainstalować całą masę bzdur, aby nasze połączenia zostały poprawnie zakończone? Poważnie ? Robi się niedobrze. Jesteśmy zgubieni.
leucos
3
Zauważ, że pierwsze uruchomienie po zainstalowaniu libpam-systemd i dbus nadal spowoduje zawieszenie sesji SSH. Aby tego uniknąć, zamiast rebootzrobić z shutdown -rdomyślnym opóźnieniem 1 minuty, pozostawiając czas na zamknięcie sesji SSH.
mivk
9

Jest to coś, co musisz ustawić po stronie klienta, a nie po stronie serwera. Edytuj swój, ~/.ssh/configaby zawierał

ServerAliveInterval 15
ServerAliveCountMax 5

Oznacza to, że po 15 sekundach bezczynności klient wyśle ​​wiadomość do serwera. Jeśli nie otrzyma żadnej odpowiedzi, spróbuje ponownie do 5 razy, a gdy nadal nie otrzyma odpowiedzi, zamknie sesję.

Jenny D.
źródło
2
Spowoduje to opóźnienie 75 sekund, zanim klient ssh zgłosi, że serwer nie działa. Dobrze?
Vesper
1
Tak, możesz dostosować parametry, aby uzyskać krótszy limit czasu.
Tero Kilkanen,
To rozwiązało problem dla mnie. Taki irytujący problem.
Justin Andrusk
5

Takie zachowanie jest zgłaszane w przypadku tego błędu Debiana , wystarczy tylko poprawnie skonfigurować skrypty zamykające dostarczane z pakietem, ponieważ automatycznie nie są one domyślnie kopiowane:

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service
Rfraile
źródło
1

Możesz określić opcje, o których mówiła Jenny D w swojej odpowiedzi tylko dla jednego polecenia ssh, na przykład

ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff

jeśli robisz to często, możesz to zrobić.

Diego Medaglia
źródło
0

Działa dla mnie z lshd. Tak byłoby rozwiązanie

apt install lsh-server
apt remove openssh-server
Bóg
źródło
0

Niestety błąd serwera nie pozwolił mi odpowiedzieć w wątku o zbyt mało punktów od lat. Ale nie muszę spamować na innych blogach, aby uzyskać odblokowanie ^^ ... więc jako dedykowaną odpowiedź:

Jak wspomniano Rfraile

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

Pracuje. Aby korzystać z niego bez ponownego uruchamiania instancji / serwera, należy wykonać dodatkowe zadania:

systemctl daemon-reload
systemctl start ssh-session-cleanup.service

więc usługa jest zarejestrowana i uruchomiona, a systemd musi ją zatrzymać w celu ponownego uruchomienia / zamknięcia.

Reiner030
źródło
Powtarzasz tylko inną odpowiedź?
RalfFriedl
Nie? Użyłem 2 wierszy tylko jako odniesienia dla górnej odpowiedzi, ponieważ nie mogę jeszcze odpowiedzieć jak napisano. Dodałem niezbędne kroki, aby użyć go bez ponownego uruchamiania. Można to podać również w innym wątku pytania, ale tego nie sprawdziłem.
Reiner030