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

我有一台运行Debiansshd的服务器,如果我需要重新启动服务器,我的SSH会话在客户端挂起,直到TCP超时。 我认为这是因为当sshd被终止时,它并没有明确closures到主机的开放SSH会话。 我应该做什么使sshd首先断开每个人,然后正常终止本身? 到目前为止,我没有看到man sshd_config中与shutsown行为有关的参数。

当您closures或重新启动系统时, systemd尝试尽可能快地停止所有服务。 这涉及到closuresnetworking并终止所有仍然存在的进程 – 通常按照这个顺序。 因此,当systemd杀死正在处理您的SSH会话的分支SSH进程时,networking连接已经被禁用,并且他们无法优雅地closures客户端连接。

你的第一个想法可能就是closures所有的SSH进程作为第一步,而且有很多系统服务文件就是这样做的。

但是,当然有一个更好的解决scheme(它是如何“应该”完成的): systemd-logind
systemd-logind跟踪活动用户会话(本地和SSH),并将其中产生的所有进程分配到所谓的“片”。 这样,当系统closures时,systemd可以在用户切片(包括分发特定会话的分叉SSH进程)内SIGTERM,然后继续closures服务和networking。

systemd-logind需要一个PAM模块来获得新用户会话的通知,并且您需要dbus使用loginctl来检查其状态,所以安装这两个:

 apt-get install libpam-systemd dbus 

确保你的/etc/ssh/sshd_config实际上是使用带有UsePAM yes的模块。

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

 ServerAliveInterval 15 ServerAliveCountMax 5 

这意味着,15秒钟不活动后,您的客户端将发送一条消息到服务器。 如果没有得到任何答复,它会再次尝试5次,当它仍然没有得到答案,它会closures会议。

你可以指定Jenny D在她的回答中提到的选项,只是为了一个ssh命令,比如

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

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

用lshd为我工作。 所以解决的办法是

 apt install lsh-server apt remove openssh-server