SSH会话在关机/重新启动时挂起


13

我有一台在其上运行Debian和sshd的服务器,以防万一我需要重启服务器,我的SSH会话在客户端挂起,直到TCP超时。我认为这是因为sshd终止时,它不会显式关闭与主机的打开的SSH会话。我应该怎么做才能sshd首先断开每个人的连接,然后按正常方式终止自身连接?到目前为止,我还没有看到man sshd_config与关机行为有关的参数。


1
如果所有其他方法均失败,则可以随时按[Enter] [〜] [。]来终止SSH客户端。以及如何实际解决您的问题的说明。
n.st

Answers:


32

当您关闭或重新引导系统时,请systemd尝试尽快停止所有服务。这涉及关闭网络并终止所有仍在运行的进程-通常按此顺序进行。因此,当systemd杀死正在处理SSH会话的分叉SSH进程时,网络连接已被禁用,它们无法正常关闭客户端连接。

您的第一个想法可能是在关闭过程中首先杀死所有SSH进程,并且有很多systemd服务文件可以执行此操作。

但是有一个过程整洁溶液(它是如何“应该”做)systemd-logind
systemd-logind跟踪活动的用户会话(本地和SSH),并将其中产生的所有进程分配给所谓的“切片”。这样,当系统关闭时,systemd可以对用户片中的所有内容(包括处理特定会话的分叉SSH进程)执行SIGTERM操作,然后继续关闭服务和网络。

systemd-logind需要一个PAM模块来通知新的用户会话,并且您需要dbus使用它loginctl来检查其状态,因此请安装以下两者:

apt-get install libpam-systemd dbus

确保您/etc/ssh/sshd_config实际上将与一起使用该模块UsePAM yes


好的,目标已经实现,感谢您的解释。(尽管我希望以某种方式进行关闭的依赖项控制,以便在完成工作时首先对所有内容进行SIGTERM处理,但这可以作为分层解决方案。)
Vesper

由于某些原因,仅访问StackOverflow时我没有得到关于答案的通知。奇怪的。
Vesper 2015年

1
因此,总之,为了在关闭时节省几秒钟的时间,我们必须安装一整堆废话,才能使我们的连接正确终止?认真吗?这有点不对劲。我们完蛋了。
leucos

3
请注意,在安装libpam-systemd和dbus之后首次重新启动仍然会使SSH会话挂起。为避免这种情况reboot,请执行shutdown -r默认为1分钟延迟的a ,而不是,这样您就有时间关闭SSH会话。
mivk

9

您需要在客户端而不是服务器端进行设置。编辑您~/.ssh/config要包含

ServerAliveInterval 15
ServerAliveCountMax 5

这意味着在闲置15秒钟后,您的客户端将向服务器发送一条消息。如果未收到任何响应,它将最多尝试5次,如果仍未收到答复,它将关闭会话。


2
这将导致ssh客户端报告服务器死机之前有75秒的延迟。对?
Vesper 2015年

1
是的,您可以调整参数以缩短超时时间。
Tero Kilkanen 2015年

这为我解决了问题。如此令人烦恼的问题。
贾斯汀·安德鲁斯克

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命令指定Jenny D在其答案中谈到的选项,例如

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

如果您经常这样做,则可以编写脚本。


0

适用于lshd。所以解决方案是

apt install lsh-server
apt remove openssh-server

0

不幸的是,多年来,serverfault并没有让我以太少的分数回答线程问题。但是我不需要在其他博客中发送垃圾邮件即可获得解锁的^^ ...,因此可以专门回答:

正如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需要将其停止以进行重新引导/关闭。


那么,您只是重复另一个答案吗?
拉尔夫弗里德尔

没有?我仅将这两行用作最高答案的参考,因为我还不能按书面要求答复。我添加了必要的步骤以使用它而无需重新启动。这也可以在另一个问题线程中给出,但我尚未签出。
Reiner030
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.