我有以下目录结构:
+ public/
|-+ pics/
| |-- a
| `-- b
`-+ thumbs/
|-- a
`-- b
gallery:http
我希望树中的所有文件都由模式集拥有ug=rwX,o=
。
该脚本恰好在其中创建目录pics
并thumbs
以用户身份运行gallery
。我在public
、pics
和上设置了 SUID/SGID 位thumbs
。
现在的问题是,该a
目录将按其应有的所有者身份创建gallery:http
,但没有x
该组的权限。如果我调用chmod
,我将清除 SGID 位。 (奇怪的行为,但这确实会发生,可能是因为http
不是文件的用户所有者。)
我无法chown
以非 root 用户身份调用来先设置模式,然后再设置所有者。
唯一的解决方案似乎是设置umask
为ug=rwx,o=
,创建所有目录,然后在创建任何常规文件之前更改umask
,或者创建常规文件,然后将其模式更改为ug=rw,o=
。
有没有我看不到的更好、不那么难看的解决方案?
答案1
如果您可以更改脚本,那么将调用更改mkdir
为mkdir --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 上设置文件权限等有哪些不同方法