systemd 单元进程正在忽略目录上的粘滞位 (sgid)

systemd 单元进程正在忽略目录上的粘滞位 (sgid)

我有一个用户 vopi,在该用户下启动了 systemd 服务(用户模式)。该服务是一个 python 脚本,它应该将文件写入路径下的共享目录/usr/local/myfolder

该组设置为myfolderbot并且我设置了一个粘性位,以使在里面创建的所有文件归该组所有bot

目前,myfolder 的权限如下

drwxrwsr-x root bot ... myfolder

用户vopi被纳入群组bot

当我启动脚本时,python main.py它会成功创建一个myfolder具有权限的文件-rw-rw-r-- vopi bot ...。但是,当我调用它时systemctl --user start myservice,它会尝试创建一个具有权限的文件-rw-r--r-- vopi vopi并失败(我通过临时将组设置vopimyfolder

为什么在 systemd 单元下运行的脚本会忽略目录上设置的粘滞位,而权限却不会-rw-rw-r--

我尝试Group=在单元配置中设置选项,但没有成功。服务失败并出现错误:216 Group

答案1

我设置了一个粘性位,以使在里面创建的所有文件都归组所有bot

这表明,添加粘性位使得文件所有权和权限遗传从父文件夹。这不是粘性位的目的。粘性位是限制删除标志

Linuxman chmod上的 描述了它的当前功能和历史:

限制删除标志或粘性位是一个位,其解释取决于文件类型。对于目录,它阻止非特权用户删除或重命名目录中的文件,除非他们拥有该文件或目录;这称为限制删除标志对于目录,并且通常在像这样的全球可写目录中找到/tmp

对于某些旧系统上的常规文件,该位将程序的文本图像保存在交换设备上,以便在运行时加载速度更快;这称为粘滞位。

你的216 Group错误来自于systemd.unit 配置没有这样的[Unit]部分选项作为Group=。这是一个systemd.exec执行环境配置) 选项属于[Service](、、[Socket][Mount])[Swap]部分:

User=, Group=

分别设置执行进程的 UNIX 用户或组。以单个用户或组名或数字 ID 作为参数。

对于系统服务(由系统服务管理器运行的服务,即由 PID 1 管理的服务)和 root 用户的用户服务(由 root 的 实例管理的服务systemd --user),默认值为root,但User=可以用来指定不同的用户。

对于任何其他用户的用户服务,不允许切换用户身份,因此唯一有效的设置是用户的服务管理器正在以相同的用户身份运行。如果没有设置组,则使用用户的默认组。此设置不会影响命令行以“+”为前缀的命令。

相关内容