作为root
,我创建/test
并设置了默认 ACL
setfacl -m -d dog:rwx /test
我验证了 getfacl 的输出
# file: test
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:dog:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
现在,作为用户dog
,如果我尝试在 中创建目录/test
,我会得到
mkdir: can't create directory 'sub': Permission denied
为什么会这样呢?如果我 setfacl 没有默认值, getfacl 显示user:dog:rwx
而不是default:user:dog:rwx
并且dog
可以在那里创建一个子目录。
答案1
分配 ACL 时,使用setfacl -m -d ...
和具有不同的行为。setfacl -m ...
这默认 ACL都是用来继承的。所以你必须分配ACL当你想要给予时acl权限给用户并分配默认 ACL继承某个目录下的权限。
解释
首先,我将目录(以 root 身份)/test
并检查其权限:
$> mkdir /test ; ls -ld /test
#Output
drwxr-xr-x 2 root root 4096 Dec 1 17:52 test
正如你所看到的,该团体和其他人没有写默认权限。让我们看一下这两个命令之间的区别setfacl
。
使用setfacl -m guest:rwx /test
当我(以 root 身份)运行该命令时,我可以使用以下命令看到以下输出:
ls -ld /test
#Output
drwxrwxr-x+ 2 root root 4096 Dec 1 17:57 test
正如您在上面看到的,该目录现在有写组的权限。顺便说一句,如果你删除ACL通过使用:setfacl --remove-all /test
并且您使用时ls -ld /test
您会注意到/test
权限已恢复为以前的权限 ( drwxr-xr-x
)。
getfacl -e /test
#Output
# file: test
# owner: root
# group: root
user::rwx
user:guest:rwx #effective:rwx
group::r-x #effective:r-x
mask::rwx
other::r-x
我曾经getfacl -e
打印过所有有效的权利,这些权利对于了解如何ACL作品。
/test
现在我将尝试在目录下创建一个文件guest
和edgar
用户:
(user:guest)> touch /test/fuzz
#All is ok!
(user:edgar)> touch /test/buzz
#touch: cannot touch '/test/buzz': Permission denied
您可以注意到guest
用户能够创建/test/fuzz
文件而edgar
不能。这种行为是正确的,因为前交叉韧带分配给guest
。
使用setfacl -dm guest:rwx /test
就我而言,语法setfacl -m -d guest:rwx /test
无效(我使用的是 openSUSE Tumbleweed)。您也可以使用setfacl -m d:guest:rwx /test
.
现在运行命令默认 ACL我有以下内容:
ls -ld /test
drwxr-xr-x+ 2 root root 4096 Dec 1 18:39 test
getfacl -e /test
# file: test
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:guest:rwx #effective:rwx
default:group::r-x #effective:r-x
default:mask::rwx
default:other::r-x
现在可以看到,该/test
目录没有写组的权限。通过使用getfacl ...
我发现默认访客用户有rwx
权限,但正如我之前所说,它们将被用来继承。因此,如果您希望在您的情况下dog
用户可以写入/test
目录,则使用:setfacl -m dog:rwx /test
。
关于默认 ACL 或继承的 ACL
- 我将设置以下内容前交叉韧带和默认访问控制列表:
#ACL
setfacl -m guest:rwx /test
#Default ACL
sudo setfacl -dm guest:r /test
- 现在我将
/test
在guest
用户下创建一个目录:
(user:guest) /test: mkdir only_r
(user:guest) /test: ls -ld only_r
drwxr-xr-x+ 2 guest guest 4096 Dec 1 19:19 only_r/
(user:guest): getfacl -e only_r
# file: only_r/
# owner: guest
# group: guest
user::rwx
user:edgar:r-- #effective:r--
user:guest:r-- #effective:r--
group::r-x #effective:r-x
mask::r-x
other::r-x
default:user::rwx
default:user:edgar:r-- #effective:r--
default:user:guest:r-- #effective:r--
default:group::r-x #effective:r-x
default:mask::r-x
default:other::r-x
- 现在我将尝试更改
only_r
目录并创建一个文件
(user:guest) /test: cd only_r
(user:guest) /test/only_r: touch fuzz
(user:guest) /test/only_r: ls
fuzz
正如您在上面所看到的,我能够更改为 only_r 并创建一个文件,尽管 ACL 还没有执行和写权限(如果目录没有执行权限,那么我无法cd
执行它)。然而,这种行为是正确的,因为 Unix 权限和所有者drwxr-xr-x+ 2 guest guest
允许guest
用户cd
和create
文件/test/only_r
- 最后,
edgar
我将尝试与用户一起cd
创建/test/only_r
一些文件:
(user:edgar) : cd /test/only_r
cd: permission denied: /test/only_r
(user:edgar) : echo jaja > only_r/fuzzbuzz
permission denied: only_r/fuzzbuzz