ssh 不会因致命错误而终止

ssh 不会因致命错误而终止

我有一个从 ssytemd 启动的自定义 sshd 服务。它的服务文件与默认服务文件基本相同openssh-server,但指定了一个sshd_config具有自定义端口和一些其他非标准设置的自定义文件。

有时,有人/run/sshd会删除系统上的目录。这会导致与此 SSHD 的所有后续连接失败并显示fatal: Missing priviledge separation directory: /run/sshd.

  1. 是什么原因导致此消息?
  2. 为什么像这样的致命错误不会导致 SSHD pid 死亡?如果进程没有终止,systemd 就不知道它必须重新启动服务。

答案1

sshd.service在我的系统上有这个:

[Service]
...
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

RuntimeDirectory是 systemd 的众多沙箱功能之一。man systyemd.exec详情请参阅。当您的服务启动时,它将确保/run/sshd使用 0755 权限创建它。但是,当设备停止时它也将被删除。

如果两个服务依赖于同一个服务,就会出现问题RuntimeDirectory=。假设您正在愉快地运行,然后另一个单元以相同的RuntimeDirectory=配置启动。当第二个单元启动时,所有文件都会递归chown到该单元的User=Group=。当该单元停止时,RuntimeDirectory=将被移除。这些行为中的任何一个都可能真正损害您的服务。

为了保护自己免受这种情况的影响,您有两种选择:

  1. 寻找使用相同的其他单位RuntimeDirectory=。几乎可以肯定sshd.service,您复制的就是原件。然后确保您的设备Conflicts=带有它。这将防止两个服务同时处于活动状态并发生竞争。如果您不想Conflict=,那么您也可以使用systemctl mask其他服务来确保它永远不会运行。
[Unit]
...
Conflicts=sshd.service
  1. 更改RuntimeDirectory=为您的服务特有的目录。

你的第二个问题对我来说有点难以回答。致命错误不关闭主 PID 的决定是 sshd 中的设计决定(或错误)。快速查看man sshdman sshd_config不能帮助我找到“致命中止”或类似内容的任何选项。

相关内容