我有一台运行Debian和sshd的服务器,如果我需要重新启动服务器,我的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