我有一个从 ssytemd 启动的自定义 sshd 服务。它的服务文件与默认服务文件基本相同openssh-server
,但指定了一个sshd_config
具有自定义端口和一些其他非标准设置的自定义文件。
有时,有人/run/sshd
会删除系统上的目录。这会导致与此 SSHD 的所有后续连接失败并显示fatal: Missing priviledge separation directory: /run/sshd
.
- 是什么原因导致此消息?
- 为什么像这样的致命错误不会导致 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=
将被移除。这些行为中的任何一个都可能真正损害您的服务。
为了保护自己免受这种情况的影响,您有两种选择:
- 寻找使用相同的其他单位
RuntimeDirectory=
。几乎可以肯定sshd.service
,您复制的就是原件。然后确保您的设备Conflicts=
带有它。这将防止两个服务同时处于活动状态并发生竞争。如果您不想Conflict=
,那么您也可以使用systemctl mask
其他服务来确保它永远不会运行。
[Unit]
...
Conflicts=sshd.service
- 更改
RuntimeDirectory=
为您的服务特有的目录。
你的第二个问题对我来说有点难以回答。致命错误不关闭主 PID 的决定是 sshd 中的设计决定(或错误)。快速查看man sshd
并man sshd_config
不能帮助我找到“致命中止”或类似内容的任何选项。