Сеанси SSH зависають при відключенні / перезавантаженні


13

У мене є сервер, який запускає Debian і sshd на ньому, і в разі, якщо мені потрібно перезавантажити сервер, моє сеанс SSH зависає на стороні клієнта до часу очікування TCP. Я припускаю, що це відбувається тому, що коли sshdвін припиняється, він не закриває явно відкритих сеансів SSH для хоста. Що мені робити, щоб sshdспочатку відключити всіх, а потім припинити себе як звичайне? Поки що я не бачу жодного параметра man sshd_config, пов’язаного з поведінкою вимкнення.


1
Якщо все інше не вдалося, ви можете вбити клієнта SSH у будь-який час, натиснувши [Enter] [~] [.]. Пояснення, як насправді вирішити вашу проблему.
— n.st

Відповіді:


32

Коли ви вимикаєте або перезавантажуєте систему, systemdнамагається зупинити всі сервіси якнайшвидше. Це передбачає зведення мережі та припинення всіх процесів, які ще живі - зазвичай у такому порядку. Отже, коли systemd вбиває роздвоєні процеси SSH, які обробляють ваші сеанси SSH, мережеве з'єднання вже відключено, і вони не мають можливості витончено закрити клієнтське з'єднання.

Вашою першою думкою може бути просто вбити всі SSH процеси як перший крок під час вимкнення, і там є досить багато системних файлів служб, які роблять саме це.

Але є, звичайно , рішення акуратним (як це «повинен» бути зроблено) systemd-logind.
systemd-logindвідслідковує активні сеанси користувача (локальні та SSH) та призначає всі породжені в них процеси так званим "фрагментам". Таким чином, коли система вимикається, systemd може просто ЗІГНІТЬ все, що знаходиться всередині користувацьких фрагментів (що включає в себе роздвоєний SSH-процес, який передає певний сеанс), а потім продовжувати відключення служб та мережі.

systemd-logindнеобхідний модуль PAM , щоб отримувати повідомлення про нові сеансах користувачів , і ви повинні будете dbusвикористовувати , loginctlщоб перевірити його стан, тому встановити обидва ці:

apt-get install libpam-systemd dbus

Будьте впевнені, що ви /etc/ssh/sshd_configдійсно збираєтеся використовувати модуль UsePAM yes.


Гаразд, мета досягнута, і дякую за пояснення. (Хоча я хотів би якийсь спосіб контролю залежності для відключення, щоб все спочатку SIGTERM мав змогу закінчити свою роботу, це можна зробити як багатошарове рішення.)
— Vesper

Чомусь мені не було повідомлено про відповідь під час відвідування лише StackOverflow. Дивно.
— Веспер

1
Отже, якщо коротко, щоб виголити кілька секунд при відключенні, нам доведеться встановити цілий набір лайна лише для того, щоб наші з'єднання належним чином припинилися? Серйозно? Це стає неправдивим. Ми приречені.
— leucos

3
Зауважте, що перше перезавантаження після встановлення системи libpam та dbus все одно залишить ваш сеанс SSH висячим. Щоб уникнути цього, замість цього rebootвиконайте за shutdown -rзамовчуванням 1 хвилину затримки, залишаючи час закрити сеанс SSH.
— mivk

9

Це те, що потрібно встановити на стороні клієнта, а не на стороні сервера. Відредагуйте свій ~/.ssh/configвміст

ServerAliveInterval 15
ServerAliveCountMax 5

Це означає, що після 15 секунд бездіяльності ваш клієнт відправить повідомлення на сервер. Якщо вона не отримає жодної відповіді, вона спробує повторно до 5 разів, а коли все одно не отримає відповіді, сеанс закриється.


2
Це призведе до затримки 75-х років, перш ніж сервер клієнтів звітує ssh. Правильно?
— Веспер

1
Так, і ви можете налаштувати параметри, щоб скоротити час.
— Tero Kilkanen

Це вирішило для мене проблему. Така дратівлива проблема.
— Джастін Андруск

5

Повідомляється про цю поведінку в цьому Debian Bug , вам потрібно лише правильно налаштувати скрипти відключення, надіслані з пакетом, оскільки автоматично вони не копіюються за замовчуванням:

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

1

Ви можете вказати варіанти, про які говорила Дженні Д у своїй відповіді лише на одну команду ssh, наприклад, як

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

якщо ви робите це часто, ви можете це сценарію.


0

Для мене працює lshd. Тож рішення було б

apt install lsh-server
apt remove openssh-server

0

на жаль, серверні за замовчуванням не дозволили мені відповісти в темі причини занадто мало балів за роки. Але мені не потрібно спамувати в інших блогах, щоб отримати розблокування ^^ ... так як виділений відповідь:

Як згадував Rfraile

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

працює. Щоб використовувати його без перезавантаження екземпляра / сервера, слід виконати додаткові завдання:

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

тож послуга зареєстрована та запущена, а системному потрібно зупинити її для перезавантаження / відключення.


Ви просто повторюєте іншу відповідь?
— РальфФрідл

Немає? Я використовував 2 рядки лише як орієнтир для верхньої відповіді, тому що поки не можу відповісти як написано. Я додав необхідні кроки, щоб використовувати його без перезавантаження. Це може бути подано і в іншій темі питання, але я не перевірив.
— Reiner030
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.