前面,我们已经学习如何使用 setfacl 和 getfacl 为用户或群组添加针对某目录或文件的 ACL 权限,例如:
[root@localhost /]# getfacl project #file: project <-文件名 #owner: root <-文件的属主 #group: tgroup <-文件的属组 user::rwx <-用户名栏是空的,说明是所有者的权限 group::rwx <-组名栏是空的,说明是所属组的权限 other::--- <-其他人的权限 [root@localhost ~]# setfacl -m u:st:rx /project #给用户st设定针对project目录的rx权限 [root@localhost /]# getfacl project #file: project #owner: root #group: tgroup user::rwx user:st:r-x <-用户 st 的权限 group::rwx mask::rwx <-mask 权限 other::---
对比添加 ACL 权限前后 getfacl 命令的输出信息,后者多了 2 行信息,一行是我们对 st 用户设定的 r-x 权限,另一行就是 mask 权限。
mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。
举个例子,如果像上面命令那样,给 st 用户赋予访问 project 目录的 r-x 权限,此时并不能说明 st 用户就拥有了对该目录的读和访问权限,还需要和 mask 权限对比,r-x 确实是在 rwx 范围内,这时才能说 st 用户拥有 r-x 权限。
需要注意的是,这里将权限进行对比的过程,实则是将两权限做“按位相与”运算,最终得出的值,即为 st 用户有效的 ACL 权限。这里以读(r)权限为例,做相与操作的结果如表 1 所示:
A | B | and |
---|---|---|
r | r | r |
r | - | - |
- | r | - |
- | - | - |
但是,如果把 mask 权限改为 r--,再和 st 用户的权限 r-x 比对(r-- 和 r-w 做与运算),由于 r-w 超出 r-- 的权限范围,因此 st 用户最终只有 r 权限,手动赋予的 w 权限无效。这就是在设定 ACL 权限时 mask 权限的作用。
大家可以这样理解 mask 权限的功能,它将用户或群组所设定的 ACL 权限限制在 mask 规定的范围内,超出部分直接失效。
mask 权限可以使用 setfacl 命令手动更改,比如,更改 project 目录 mask 权限值为 r-x,可执行如下命令:
[root@localhost ~]# setfacl -m m:rx /project #设定mask权限为r-x,使用"m:权限"格式 [root@localhost ~]# getfacl /project #file:project #owner:root #group:tgroup user::rwx group::rwx mask::r-x <--mask权限变为r-x other::---
不过,我们一般不更改 mask 权限,只要赋予 mask 最大权限(也就是 rwx),则给用户或群组设定的 ACL 权限本身就是有效的。