如何调用 chmod 并保留 SGID 位?

如何调用 chmod 并保留 SGID 位?

我有以下目录结构:

+ public/
|-+ pics/
| |-- a
| `-- b
`-+ thumbs/
  |-- a
  `-- b

gallery:http我希望树中的所有文件都由模式集拥有ug=rwX,o=

该脚本恰好在其中创建目录picsthumbs以用户身份运行gallery。我在publicpics和上设置了 SUID/SGID 位thumbs

现在的问题是,该a目录将按其应有的所有者身份创建gallery:http,但没有x该组的权限。如果我调用chmod,我将清除 SGID 位。 (奇怪的行为,但这确实会发生,可能是因为http不是文件的用户所有者。)

我无法chown以非 root 用户身份调用来先设置模式,然后再设置所有者。

唯一的解决方案似乎是设置umaskug=rwx,o=,创建所有目录,然后在创建任何常规文件之前更改umask,或者创建常规文件,然后将其模式更改为ug=rw,o=

有没有我看不到的更好、不那么难看的解决方案?

答案1

如果您可以更改脚本,那么将调用更改mkdirmkdir --mode=770.

如果您无法更改脚本,那么 ACL 可能会有所帮助:

setfacl -m d:u::rwx,d:g::rwx,o::- pics thumbs

umask不设置文件的可执行权限。它从不设置任何权限;它只是阻止在文件创建时设置权限。

答案2

您有几个选择:

  • chmod g+x a
  • 更改掩码
  • 使用访问控制列表。

是的,您可以设置位而不清除其他位。请参阅第一个选项。但要使其更加自动化,请执行以下操作之一:

  • 将 umask 设置为 rwxr-x---,并让每个用户都有一个私有默认组(他们的主要组仅属于他们)。
  • 使用访问控制列表:使用这些列表,您不仅可以设置多个组和用户的权限,还可以设置目录的默认值(很像 sgid,但不仅是组,还可以设置模式)。请参见 setfacl、getfacl。也可以看看在 gnu/linux 上设置文件权限等有哪些不同方法

相关内容