可能是晚上了,但这让我很困惑。请想象一下下面的场景。
[root@node1 acltest]# getfacl foo/
# file: foo
# owner: root
# group: testuser
user::rwx
group::r-x
other::---
[root@node1 acltest]# ls -la .
total 24
drwxr-xr-x 3 root root 4096 Feb 9 21:53 .
drwxr-xr-x 25 root root 4096 Feb 9 21:54 ..
drwxr-x--- 2 root testuser 4096 Feb 9 21:53 foo
[root@node1 acltest]# setfacl -m m::rwx foo
[root@node1 acltest]# getfacl foo/
# file: foo
# owner: root
# group: testuser
user::rwx
group::r-x
mask::rwx
other::---
[root@node1 acltest]# ls -la .
total 24
drwxr-xr-x 3 root root 4096 Feb 9 21:53 .
drwxr-xr-x 25 root root 4096 Feb 9 21:54 ..
drwxrwx---+ 2 root testuser 4096 Feb 9 21:53 foo
[root@node1 acltest]# su - testuser
[testuser@node1 ~]$ cd /acltest/foo/
[testuser@node1 foo]$ ls -la .
total 16
drwxrwx---+ 2 root testuser 4096 Feb 9 21:53 .
drwxr-xr-x 3 root root 4096 Feb 9 21:53 ..
[testuser@node1 foo]$ touch bar
touch: cannot touch `bar': Permission denied
换句话说:我创建一个目录foo
,模式为0750
,root
所有者和testuser
组为。(testuser
是的私人群组testuser
,但这并不重要。)
该getfacl
命令正确显示此目录上没有 ACL,并且还没有掩码。如果我现在添加命名组或用户,掩码将根据组权限进行设置。
如果我明确将掩码设置为rwx
now,则显示的组权限ls
也会更改。我知道情况正好相反(当组权限更改时,掩码也会更改),但这似乎令人费解。
更令人费解的是,getfacl
输出确实不是显示组权限,rwx
但 - 正如所说 -ls
确实如此。
哪一个是正确的?显然, 的输出getfacl
是正确的,因为testuser
无法写入foo
。顺便说一句,正如预期的那样,因为我没有授予该testuser
组任何权限。
继续。我无法仅通过使用 来允许testuser
组在 上写入权限。我必须使用 明确设置 ACL以允许最终接触。foo
chmod
setfacl -m g:testuser:rwx foo
testuser
foo/bar
getfacl
有人能解释一下和输出差异背后的原因ls
吗?我知道将普通权限与 ACL 结合起来可能很棘手,但这似乎完全是错误的。(虽然我预计会遗漏一些显而易见的东西 ;))
答案1
来自 acl 的 man(5) 页
ACL_MASK The ACL_MASK entry denotes the maximum access rights that can be granted by entries of type ACL_USER, ACL_GROUP_OBJ, or ACL_GROUP.
然后:
- 否则,如果进程的有效组 ID 或任何补充组 ID 与文件组或任何 ACL_GROUP 类型的条目的限定符匹配,则
if the ACL contains an ACL_MASK entry, then
if the ACL_MASK entry and any of the matching ACL_GROUP_OBJ
or ACL_GROUP entries contain the requested permissions,
access is granted,
else access is denied.
这意味着 rwx能在目录上被授予,但 chmod 位必须与之一致。
答案2
我想补充一点,当在对象上使用 ACL 时,ls -l 列出的权限有点不同。
根据 man ACL(5):
ACL 条目和文件权限位之间的对应关系
ACL 定义的权限是文件权限位指定的权限的超集。
文件的所有者、组和其他权限与具体的ACL条目之间存在对应关系:所有者权限对应于ACL_USER_OBJ条目的权限。如果ACL有ACL_MASK条目,则组权限对应于ACL_MASK条目的权限。否则,如果ACL没有ACL_MASK条目,则组权限对应于ACL_GROUP_OBJ条目的权限。其他权限对应于ACL_OTHER_OBJ条目的权限。
因此,在使用 ACL 时,您应该将 ls -l 输出的组权限部分视为 ACL 掩码。