Vesper Asked: 2015-07-18 00:16:30 +0800 CST2015-07-18 00:16:30 +0800 CST 2015-07-18 00:16:30 +0800 CST SSH 会话在关机/重启时挂起 772 我有一台运行 Debian 和 sshd 的服务器,如果我需要重新启动服务器,我的 SSH 会话会在客户端挂起,直到 TCP 超时。我认为这是因为当sshd被终止时,它没有明确关闭与主机的打开的 SSH 会话。我应该怎么做才能sshd首先断开每个人,然后正常终止自己?到目前为止,我没有看到man sshd_config与关闭行为相关的参数。 debian ssh systemd 6 个回答 Voted Best Answer n.st 2015-07-18T01:20:15+08:002015-07-18T01:20:15+08:00 当您关闭或重新启动系统时,请systemd尽可能快地停止所有服务。这涉及关闭网络并终止所有仍然存在的进程 - 通常按此顺序。因此,当 systemd 杀死正在处理您的 SSH 会话的分叉 SSH 进程时,网络连接已经被禁用,它们无法正常关闭客户端连接。 您的第一个想法可能是在关机期间首先杀死所有 SSH 进程,并且有相当多的 systemd 服务文件可以做到这一点。 但是当然有一个更简洁的解决方案(“应该”如何完成):systemd-logind. systemd-logind跟踪活动用户会话(本地和 SSH 会话)并将其中产生的所有进程分配给所谓的“切片”。这样,当系统关闭时,systemd 只需 SIGTERM 用户片内的所有内容(包括处理特定会话的分叉 SSH 进程),然后继续关闭服务和网络。 systemd-logind需要一个 PAM 模块来获得新用户会话的通知,您需要dbus使用loginctl它来检查它的状态,所以安装这两个: apt-get install libpam-systemd dbus 确保您/etc/ssh/sshd_config实际上将模块与UsePAM yes. Jenny D 2015-07-18T00:36:28+08:002015-07-18T00:36:28+08:00 这是您需要在客户端而不是服务器端设置的内容。编辑你~/.ssh/config的包含 ServerAliveInterval 15 ServerAliveCountMax 5 这意味着在 15 秒不活动后,您的客户端将向服务器发送一条消息。如果没有得到任何响应,它将重试最多 5 次,当仍然没有得到响应时,它将关闭会话。 rfmoz 2019-03-19T03:37:57+08:002019-03-19T03:37:57+08:00 此Debian Bug报告了此行为,您只需要正确设置软件包随附的关闭脚本,因为默认情况下不会自动复制它们: cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/ systemctl enable ssh-session-cleanup.service Diego Medaglia 2016-12-04T18:12:42+08:002016-12-04T18:12:42+08:00 您可以为一个 ssh 命令指定 Jenny D 在她的回答中谈到的选项,例如 ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff 如果你经常这样做,你可以编写脚本。 god 2015-08-04T06:57:32+08:002015-08-04T06:57:32+08:00 与 lshd 一起为我工作。所以解决方案是 apt install lsh-server apt remove openssh-server Reiner030 2019-05-08T08:55:35+08:002019-05-08T08:55:35+08:00 可悲的是,多年来,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 需要将其停止以重新启动/关闭。
当您关闭或重新启动系统时,请
systemd
尽可能快地停止所有服务。这涉及关闭网络并终止所有仍然存在的进程 - 通常按此顺序。因此,当 systemd 杀死正在处理您的 SSH 会话的分叉 SSH 进程时,网络连接已经被禁用,它们无法正常关闭客户端连接。您的第一个想法可能是在关机期间首先杀死所有 SSH 进程,并且有相当多的 systemd 服务文件可以做到这一点。
但是当然有一个更简洁的解决方案(“应该”如何完成):
systemd-logind
.systemd-logind
跟踪活动用户会话(本地和 SSH 会话)并将其中产生的所有进程分配给所谓的“切片”。这样,当系统关闭时,systemd 只需 SIGTERM 用户片内的所有内容(包括处理特定会话的分叉 SSH 进程),然后继续关闭服务和网络。systemd-logind
需要一个 PAM 模块来获得新用户会话的通知,您需要dbus
使用loginctl
它来检查它的状态,所以安装这两个:确保您
/etc/ssh/sshd_config
实际上将模块与UsePAM yes
.这是您需要在客户端而不是服务器端设置的内容。编辑你
~/.ssh/config
的包含这意味着在 15 秒不活动后,您的客户端将向服务器发送一条消息。如果没有得到任何响应,它将重试最多 5 次,当仍然没有得到响应时,它将关闭会话。
此Debian Bug报告了此行为,您只需要正确设置软件包随附的关闭脚本,因为默认情况下不会自动复制它们:
您可以为一个 ssh 命令指定 Jenny D 在她的回答中谈到的选项,例如
如果你经常这样做,你可以编写脚本。
与 lshd 一起为我工作。所以解决方案是
可悲的是,多年来,serverfault 并没有让我在线程中回答问题,原因是太少了。但是我不需要在其他博客中发送垃圾邮件来获得解锁^^...所以专门的答案:
正如Rfraile提到的
作品。要在不重新启动实例/服务器的情况下使用它,您应该执行其他任务:
因此该服务已注册并启动,systemd 需要将其停止以重新启动/关闭。