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

Ves*_*per 16 debian ssh systemd

我有一台运行 Debian 和 sshd 的服务器,如果我需要重新启动服务器,我的 SSH 会话会在客户端挂起,直到 TCP 超时。我认为这是因为在sshd终止时它没有明确关闭与主机的打开的 SSH 会话。我应该怎么做才能让sshd所有人先断开连接,然后正常终止?到目前为止,我没有看到man sshd_config与关闭行为相关的参数。

n.s*_*.st 35

当您关闭或重新启动系统时,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
Run Code Online (Sandbox Code Playgroud)

确保您/etc/ssh/sshd_config实际上将使用带有UsePAM yes.

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

Jen*_*y D 10

这是您需要在客户端而不是服务器端设置的内容。编辑你~/.ssh/config的包含

ServerAliveInterval 15
ServerAliveCountMax 5
Run Code Online (Sandbox Code Playgroud)

这意味着在 15 秒不活动后,您的客户端将向服务器发送一条消息。如果它没有得到任何响应,它会重试最多 5 次,当它仍然没有得到响应时,它会关闭会话。

  • 这将导致 ssh 客户端报告服务器死机之前的 75 秒延迟。对? (3认同)

Rfr*_*ile 7

此行为在此Debian Bug上报告,您只需要正确设置软件包附带的关闭脚本,因为默认情况下它们不会自动复制:

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service
Run Code Online (Sandbox Code Playgroud)