Сеанси 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.