我正在尝试在ls
对目录的所有者和组具有 acl 权限的目录上执行命令(没有标准的 posix 权限集)。即使getfacl
说用户应该能够这样做,这也会导致 Permission Denied。
这就是我正在做的事情:
- 在其中创建一个目录和一个文件。
mkdir /tmp/mydir && touch /tmp/mydir/myfile
- 检查我是否可以
ls
在此目录上执行。
jgazula@gazula:/tmp$ ls -al /tmp/mydir/
total 896
drwxrwxr-x 2 jgazula jgazula 4096 Nov 1 11:57 .
drwxrwxrwt 25 root root 909312 Nov 1 11:57 ..
-rw-rw-r-- 1 jgazula jgazula 0 Nov 1 11:57 myfile
- 现在,让我们删除此目录上的所有标准 posix 权限。
chmod 000 /tmp/mydir
- 验证权限。
jgazula@gazula:/tmp$ ls -al /tmp | grep mydir
d--------- 2 jgazula jgazula 4096 Nov 1 11:57 mydir
- 我们现在应该做不到
ls
。
jgazula@gazula:/tmp$ ls -al /tmp/mydir/
ls: cannot open directory '/tmp/mydir/': Permission denied
- 设置
jgazula
用户和组的 acl 权限。
sudo setfacl --mask -Rm u:jgazula:rwx,g:jgazula:rwx /tmp/mydir/
- 验证 acl 权限。
jgazula@gazula:/tmp$ getfacl -ep /tmp/mydir/
# file: /tmp/mydir/
# owner: jgazula
# group: jgazula
user::---
user:jgazula:rwx #effective:rwx
group::--- #effective:---
group:jgazula:rwx #effective:rwx
mask::rwx
other::---
- 既然acl权限(包括有效权限)看起来不错,应该可以
ls
在目录上执行吧?
jgazula@gazula:/tmp$ ls -al /tmp/mydir/
ls: cannot open directory '/tmp/mydir/': Permission denied
但我不能,我不明白为什么。
- 有趣的是,当我检查标准 posix 权限时,组权限位已设置?不确定我是否理解为什么只更新了组权限。
jgazula@gazula:/tmp$ ls -al /tmp | grep mydir
d---rwx---+ 2 jgazula jgazula 4096 Nov 1 12:13 mydir
- 让我们为所有者和组设置 acl 权限(即,从命令中省略所有者/组)。
sudo setfacl --mask -Rm u::rwx,g::rwx /tmp/mydir/
- 再次验证 acl 权限。
jgazula@gazula:/tmp$ getfacl -ep /tmp/mydir/
# file: /tmp/mydir/
# owner: jgazula
# group: jgazula
user::rwx
user:jgazula:rwx #effective:rwx
group::rwx #effective:rwx
group:jgazula:rwx #effective:rwx
mask::rwx
other::---
- 检查我
ls
现在是否可以执行。
jgazula@gazula:/tmp$ ls -al /tmp/mydir/
total 896
drwxrwx---+ 2 jgazula jgazula 4096 Nov 1 11:57 .
drwxrwxrwt 25 root root 909312 Nov 1 11:57 ..
-rwxrwxr--+ 1 jgazula jgazula 0 Nov 1 11:57 myfile
为什么步骤#6 不能单独工作?我正在为用户和组显式设置 acl 权限。为什么我需要执行步骤 #11?
运行时
sudo setfacl --mask -Rm u:jgazula:rwx,g:jgazula:rwx /tmp/mydir/
,您正在为 user 创建一个ACL_USER
条目jgazula
。但是ACL_USER_OBJ
对于文件的所有者来说仍然是---
.getfacl
(您可以在步骤 7的输出中看到这一点。)根据
man ACL
,访问检查算法如下:因此,该
ACL_USER
条目甚至从未被检查过。关于 serverfault 基本上有同样的问题:ACL:giving - - permissions for the owner of the file。(但看起来那里的答案是
ACL_USER
相反ACL_USER_OBJ
的。)