我很确定这是一个愚蠢的错误,但我自己似乎无法弄清楚,所以请看一下。
我为当前文件夹设置了 ACL,如下所示:
zigbee2mqtt@nuc:/tmp/folder$ getfacl .
# file: .
# owner: zigbee2mqtt
# group: zigbee2mqtt
user::rwx
user:stack:r-x
user:zigbee2mqtt:rwx
user:milkpirate:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:stack:r-x
default:user:zigbee2mqtt:rwx
default:user:milkpirate:rwx
default:group::---
default:mask::rwx
default:other::---
zigbee2mqtt@nuc:/tmp/folder$ id
uid=978(zigbee2mqtt) gid=977(zigbee2mqtt) groups=977(zigbee2mqtt)
所以当我现在在该文件夹中创建一个文件夹/文件时,如下所示:
zigbee2mqtt@nuc:/tmp/folder$ touch foo; mkdir bar
它会导致该文件夹具有以下权限foo
:
zigbee2mqtt@nuc:/tmp/folder$ getfacl foo
# file: foo
# owner: zigbee2mqtt
# group: zigbee2mqtt
user::rwx
user:stack:r-x
user:zigbee2mqtt:rwx
user:milkpirate:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:stack:r-x
default:user:zigbee2mqtt:rwx
default:user:milkpirate:rwx
default:group::---
default:mask::rwx
default:other::---
到目前为止看起来还不错。
但该文件的 ACL 看起来却消失了:
# file: bar
# owner: zigbee2mqtt
# group: zigbee2mqtt
user::rw-
user:stack:r-x #effective:r--
user:zigbee2mqtt:rwx #effective:rw-
user:milkpirate:rwx #effective:rw-
group::---
mask::rw-
other::---
- 我希望
mask
是rwx
(期望的)。 - 因为
group
和other
是(期望的)相同的---
许可,但它们是:ls -la
zigbee2mqtt@nuc:/tmp/folder$ ls -la
total 20
drwxrwx---+ 3 zigbee2mqtt zigbee2mqtt 4096 Jan 15 17:55 .
drwxrwxrwt 16 root root 4096 Jan 15 17:59 ..
-rw-rw----+ 1 zigbee2mqtt zigbee2mqtt 0 Jan 15 17:55 bar
drwxrwx---+ 2 zigbee2mqtt zigbee2mqtt 4096 Jan 15 17:55 foo
但我期望(并且渴望):
zigbee2mqtt@nuc:/tmp/folder$ ls -la
total 20
drwxrwx---+ 3 zigbee2mqtt zigbee2mqtt 4096 Jan 15 17:55 .
drwxrwxrwt 16 root root 4096 Jan 15 17:59 ..
-rw-------+ 1 zigbee2mqtt zigbee2mqtt 0 Jan 15 17:55 bar
drwx------+ 2 zigbee2mqtt zigbee2mqtt 4096 Jan 15 17:55 foo
编辑:
好的,做了一些测试,一切似乎都按预期工作,结果ls -la
似乎没有反映正确的权利:
zigbee2mqtt@nuc:/tmp/folder$ sudo -u nginx -g zigbee2mqtt bash
nginx@nuc:/tmp/folder$ ls
ls: cannot open directory '.': Permission denied
答案1
您在列表中看到的ls
是“传统”权限位,这是您在不支持 ACL 的系统中所拥有的所有权限,并且所有这些权限都可以由不支持 ACL 的工具(或用户!)使用。
“传统”组权限位不对应于所属组 ACL,但对应于 ACL 掩码(acl(5)
手册页):
ACL 条目和文件权限位之间的对应关系
ACL 定义的权限是文件权限位指定的权限的超集。
文件所有者、组和其他权限与特定 ACL 条目之间存在对应关系:所有者权限对应于 ACL_USER_OBJ 条目的权限。如果ACL中有ACL_MASK条目,则组权限对应于ACL_MASK条目的权限。 否则,如果 ACL 没有 ACL_MASK 条目,则组权限对应于 ACL_GROUP_OBJ 条目的权限。其他权限对应于ACL_OTHER条目的权限。
掩码的作用是限制 ACL 条目可以为命名用户、命名组或所属组授予的权限。在某种程度上,您可以将三组“传统”权限位视为适用于 1) 拥有用户,2) 其他显式定义的用户(没有 ACL:拥有组的成员;有 ACL:加上其他指定的用户)用户或其他命名组的成员),以及 3)其他所有人。
实际的推理是,如果用户或程序想要确保只有所有者对文件具有写权限,类似的操作chmod go-w
仍然可以做到这一点,即使参与者不知道 ACL。
因此,让它rwx
在列表中为组显示ls
是设计使然,因为那里有user:zigbee2mqtt:rwx
和user:stack:r-x
ACL 条目。输出ls
只是暗示除了拥有用户之外还有其他一些用户对该文件具有读取、写入和/或执行权限。将掩码设置为000
(使用例如chmod g-rwx
或适当的setfacl
命令)将使这些 ACL 条目user:zigbee2mqtt
无效user:stack
。
当您使用 , 创建文件touch
并查看mask::rw-
它时,这是因为touch
大多数其他工具创建具有权限 的常规文件0666
,而不是0777
,从而保留了这些x
位。大多数文件不应该是可执行的。无论 ACL 如何,传递给open()
系统调用的权限仍然有效,就像使用 更改权限一样chmod()
。除了关闭这些x
位之外,这还允许程序通过将权限位设置为 来创建私有文件0600
。