У меня есть сервер, на котором запущены Debian и sshd, и в случае, если мне нужно перезагрузить сервер, мой сеанс SSH зависает на стороне клиента до тех пор, пока не истечет время ожидания TCP. Я предполагаю, что это связано с тем, что когда sshd
завершается, он не закрывает явно открытые сеансы SSH с хостом. Что мне сделать, чтобы sshd
сначала отключил всех, а затем завершил себя как обычно? Пока я не вижу параметра в man sshd_config
, который связан с поведением при завершении работы.
Kai išjungiate arba perkraunate sistemą, systemd
bando kuo greičiau sustabdyti visas paslaugas. Tai reiškia, kad reikia nutraukti tinklą ir nutraukti visus dar gyvus procesus - paprastai tokia tvarka. Taigi, kai „systemd“ užmuša išsišakojusius SSH procesus, kurie tvarko jūsų SSH seansus, tinklo ryšys jau yra išjungtas ir jie niekaip negali maloniai uždaryti kliento ryšio.
Pirmiausia jums gali kilti mintis tiesiog užmušti visus SSH procesus kaip pirmąjį. žingsnis išjungimo metu, ir yra nemažai „systemd“ paslaugų failų, kurie tai daro.
Tačiau, žinoma, yra tvarkingesnis sprendimas (kaip tai „turėtų būti daroma“): systemd-logind
.
systemd-logind
seka aktyvių vartotojų seansus (vietinius ir SSH) ir visus juose pagimdytus procesus priskiria vadinamosioms „skiltelėms“. Tokiu būdu, kai sistema bus išjungta, systemd gali tiesiog SIGTERM viską, kas yra vartotojo griežinėliuose (įskaitant šakotą SSH procesą, kuris perduoda tam tikrą seansą), tada tęsti paslaugų ir tinklo uždarymą.
systemd-logind
reikalingas PAM modulis, kad gautumėte pranešimus apie naujus vartotojo seansus, o norint patikrinti jo būseną, turėsite dbus
naudoti loginctl
, todėl įdiekite abu šiuos elementus:
apt-get install libpam-systemd dbus
Įsitikinkite, kad / etc / ssh / sshd_config
iš tikrųjų naudos modulį su UsePAM taip
.
Tai reikia nustatyti kliento, o ne serverio pusėje. Redaguokite savo ~ / .ssh / config
, kad būtų
ServerAliveInterval 15
ServerAliveCountMax 5
. Tai reiškia, kad po 15 sekundžių neveikimo jūsų klientas išsiųs pranešimą serveriui. Jei negaus jokio atsakymo, bandys dar kartą iki 5 kartų, o kai vis tiek negaus atsakymo, sesiją uždarys.
У меня работает с lshd. Таким образом, решение будет
apt install lsh-server
apt remove openssh-server
Вы можете указать параметры, о которых говорила Дженни Д. в своем ответе, только для одной команды ssh, например
ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff
если вы делаете это часто, вы можете написать сценарий.
Об этом сообщается в этой ошибке Debian , вам нужно только правильно настроить сценарии выключения, поставляемые с пакетом, потому что автоматически они не копируются по умолчанию:
cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl enable ssh-session-cleanup.service
к сожалению, сервер не позволил мне ответить в потоке, потому что с годами слишком мало очков. Но мне не нужен спам в других блогах, чтобы получить разблокировку ^^... так что выделенный ответ:
Как упоминал 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
, чтобы сервис был зарегистрирован и запущен, а systemd остановил его для перезагрузки/остановки.