1.1 ACL的用法
ACL的用法如下。
setfacl ‐m u: 用户名 :rw‐ file/dir ‐‐对用户设置ACL
setfacl ‐m g: 组名 :rw‐ file/dir ‐‐对组设置ACL
在/opt下创建一个文件/opt/aa.txt,命令如下。
[root@RedHat ~]# cd /opt/
[root@RedHat opt]# touch aa.txt
[root@RedHat opt]# ls -ls aa.txt
0 -rw-r--r--. 1 root root 0 12月 6 12:07 aa.txt
[root@RedHat opt]#
打开一个新的终端使用bdqn用户登录,然后在aa.txt中测试写,对于bdqn用户来说,只能使用o的权限,所以bdqn用户是不能往此aa.txt中写内容的。
[bdqn@RedHat ~]$ echo aaa > /opt/aa.txt
-bash: /opt/aa.txt: 权限不够
[bdqn@RedHat ~]$
此时是写不进去的,使用root用户对aa.txt设置ACL权限,首先查看aa.txt是否具有ACL权限,使用getfacl命令查看,如下所示。
[root@RedHat opt]# getfacl aa.txt
# file: aa.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@RedHat opt]#
如果不想结果中显示前面几行带有#的,可以加上-c选项,命令如下。
[root@RedHat opt]# getfacl -c aa.txt
user::rw-
group::r--
other::r--
[root@RedHat opt]#
设置aa.txt的ACL权限,使得bdqn用户对aa.txt只具有写权限而没有读权限,并查看aa.txt文件的权限。
[root@RedHat opt]# setfacl -m u:bdqn:-w- aa.txt
[root@RedHat opt]# getfacl -c aa.txt
user::rw-
user:bdqn:-w-
group::r--
mask::rw-
other::r--
[root@RedHat opt]#
使用bdqn用户进行测试,命令如下。
[bdqn@RedHat ~]$ echo aaa > /opt/aa.txt
[bdqn@RedHat ~]$ cat /opt/aa.txt
cat: /opt/aa.txt: 权限不够
[bdqn@RedHat ~]$
可以看到bdqn用户对/opt/aa.txt具备写权限,但是没有读权限。
为aa.txt设置ACL权限,让bdqn用户具备读写权限,命令如下。
[root@RedHat opt]# setfacl -m u:bdqn:rw- aa.txt
[root@RedHat opt]#
可以看到,bdqn用户对aa.txt具有rw权限了,然后使用bdqn用户往aa.txt中写入数据,如下所示。
[bdqn@RedHat ~]$ echo aaa > /opt/aa.txt
[bdqn@RedHat ~]$ cat /opt/aa.txt
aaa
[bdqn@RedHat ~]$
已经成功写进去了,也能看到文件中的内容。
如果对组设置ACL权限,如设置aa.txt的ACL权限,让tom组的用户具备读写权限,命令如下。
[root@RedHat opt]# setfacl -m g:tom:rw- aa.txt
此后凡是tom组的用户对aa.txt都具有rw权限。
1.2 ACL的mask权限
先查看aa.txt的ACL权限。
[root@RedHat opt]# getfacl -c aa.txt
user::rw- ## ACL_USER_OBJ
user:bdqn:rw- ## ACL_USER
group::r-- ## ACL_GROUP_OBJ
group:tom:rw- ## ACL_GROUP
mask::rw- ## ACL_MASK
other::r--
[root@RedHat opt]#
- ACL_USER_OBJ:文件的所有者。
- ACL_USER:通过ACL授权的用户。
- ACL_GROUP_OBJ:文件所属组。
- ACL_GROUP:通过ACL授权的组。
- ACL_MASK:ACL_USER、ACL_GROUP_OBJ和ACL_GROUP中的最大权限。
如果没有手动配置ACL_MASK的权限,则ACL_MASK的权限会随着ACL_USER、ACL_GROUP_OBJ和ACL_GROUP的变化而变化,始终是这几个权限的最大值。
假设将tom组(ACL_GROUP)的权限改成r--,命令如下。
[root@RedHat opt]# setfacl -m g:tom:r-- aa.txt
[root@RedHat opt]# getfacl -c aa.txt
user::rw-
user:bdqn:rw-
group::r--
group:tom:r--
mask::rw-
other::r--
[root@RedHat opt]#
这里因为ACL_USER(bdqn)用户的权限是rw,是这几者中最高的,所以ACL_MASK的权限并没有改变。现在将bdqn的ACL权限改成--,命令如下。
[root@RedHat opt]# setfacl -m u:bdqn:-- aa.txt
[root@RedHat opt]# getfacl -c aa.txt
user::rw-
user:bdqn:---
group::r--
group:tom:r--
mask::r--
other::r--
[root@RedHat opt]#
因为这几者最高的权限为r,所以ACL_MASK的权限为r。
如果将bdqn的ACL权限设置为rwx,如下所示。
[root@RedHat opt]# setfacl -m u:bdqn:rwx aa.txt
[root@RedHat opt]# getfacl -c aa.txt
user::rw-
user:bdqn:rwx
group::r--
group:tom:r--
mask::rwx
other::r--
[root@RedHat opt]#
bdqn现在的权限是最高的,所以mask也跟着变成了rwx。
当然,我们也可以手动设置ACL_MASK的权限,语法如下。
setfacl ‐m m::rw‐ file/dir
下面手动将aa.txt的mask权限设置为r--。
[root@RedHat opt]# setfacl -m m:r-- aa.txt
[root@RedHat opt]# getfacl -c aa.txt
user::rw-
user:bdqn:rwx #effective:r--
group::r--
group:tom:r--
mask::r--
other::r--
[root@RedHat opt]#
刚才讲mask是 ACL USER、ACL_GROUP_OBJ和ACL_GROUP中的最大权限,所以即使blab用户的权限有rwx,但是生效的只有r权限,即上面结果中#effective:r--显示的,因为最大权限被限定在r了。
如果将 mask权限设置为---呢?
[root@RedHat opt]# setfacl -m m:--- aa.txt
[root@RedHat opt]# getfacl -c aa.txt
user::rw-
user:bdqn:rwx #effective:---
group::r-- #effective:---
group:tom:r-- #effective:---
mask::---
other::r--
[root@RedHat opt]#
因为mask是最高权限,所以上面显示的ACL_USER、ACL_GROUP_OBJ和ACL_GROUP实际能使用的权限均为---。下面测试 lduan用户是否能读和写aa.txt 的内容,如下所示。
[bdqn@RedHat ~]$ cat /opt/aa.txt
aaa
[bdqn@RedHat ~]$ echo bbb > /opt/aa.txt
-bash: /opt/aa.txt: 权限不够
[bdqn@RedHat ~]$
可以看到,bdqn用户能读但是不能写,这与mask权限---相嗓,因为这里又涉及了other权限,前面可以看到o的权限为r,所以bdqn用户是能读但是不能写的。
如果给o设置一个写权限,命令如下。
[root@RedHat opt]# chmod o+w aa.txt
[root@RedHat opt]#
则bdqn用户可以往aa.txt中写内容。
[bdqn@RedHat ~]$ cat /opt/aa.txt
aaa
[bdqn@RedHat ~]$ echo bbb > /opt/aa.txt
[bdqn@RedHat ~]$
把mask权限设置为r--。
[root@RedHat opt]# setfacl -m m:r-- aa.txt
[root@RedHat opt]# getfacl -c aa.txt
user::rw-
user:bdqn:rwx #effective:r--
group::r--
group:tom:r--
mask::r--
other::rw-
[root@RedHat opt]#
这里other权限是rw,然后用bdqn进行测试。
[bdqn@RedHat ~]$ cat /opt/aa.txt
bbb
[bdqn@RedHat ~]$ echo bbb > /opt/aa.txt
-bash: /opt/aa.txt: 权限不够
[bdqn@RedHat ~]$
可以看到,此时bdqn用户能读但是不能写。
结论:
(1)如果没有手动设置ACL的mask权限,则对用户/组设置的ACL 权限生效,不用考虑o的权限。
(2)如果手动设置了mask权限,且mask权限被设置为了---,则other权限生效。如果手动设置mask权限只要不是---,则不考虑other权限。重新给任一用户设置ACL 权限,则自动取消手动设置的mask权限。
要取消ACL,语法如下。
setfacl ‐x u:用户名 file/dir
或
setfacl ‐x u:用户名 file/dir
要取消用户bdqn和tom组的ACL权限,命令如下。
[root@RedHat opt]# setfacl -x u:bdqn aa.txt
[root@RedHat opt]# setfacl -x u:tom aa.txt
[root@RedHat opt]#
1.3 设置默认权限
当我们对目录设置ACL时,还可以设置默认ACL 权限,语法如下。
setfacl ‐m d:u:user1:rwx dir
不管谁在目录dir中新创建的目录或文件,对user1都会自动设置ACL权限rwx。
这里语法中的d(default)是默认的意思。为了更好地解释,我们看下面的例子。
创建目录/opt/xx,为了测试方便,可以设置ACL 权限,让tom具有rwx权限,命令如下。
[root@RedHat opt]# mkdir xx
[root@RedHat opt]# setfacl -m u:tom:rwx xx
[root@RedHat opt]# getfacl -c xx
user::rwx
user:tom:rwx
group::r-x
mask::rwx
other::r-x
[root@RedHat opt]#
现在设置bdqn对目录xx的默认ACL权限为rwx,命令如下。
[root@RedHat opt]# setfacl -m d:u:bdqn:rwx xx
[root@RedHat opt]# getfacl -c xx
user::rwx
user:tom:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:bdqn:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@RedHat opt]#
不管任何人在目录xx中新创建的文件或目录,对bdqn都会有默认ACL权限rwx。
测试:使用lisi用户在 /opt/xx下创建一个文件 aa.txt,然后查看此文件的ACL权限,命令如下。
[tom@RedHat ~]$ touch /opt/xx/aa.txt
[tom@RedHat ~]$ getfacl ‐c /opt/xx/aa.txt
getfacl: Removing leading '/' from absolute path names
user::rw‐
user:blab:rwx #effective:rw‐
group::r‐x #effective:r‐‐
mask::rw‐
other::r‐‐
[tom@RedHat ~]$
可以看到,bdqn对/opt/xx/aa.txt具有默认ACL权限 rwx。因为除了后期修改权限,创建文件时不会出现x权限,所以这里出现了#effective:rw-。
然后bdqn用户往/opt/xx 中写入内容。
[bdqn@RedHat ~]$ touch /opt/xx/aa.txt
touch: 无法创建 '/opt/xx/aa.txt': 权限不够
[bdqn@RedHat ~]$
会发现权限不够,写不进去,说明默认权限是对/opt/xx中新创建的目录或文件,并非对/opt/xx本身设置权限。
取消默认权限,命令如下。
[root@RedHat opt]# setfacl -x d:u:bdqn xx
[root@RedHat opt]#
取消默认权限之后,以后在/opt/xx中新创建的文件对bdqn用户不会有默认ACL权限但是已经存在的文件的默认权限也不会取消。
清空/opt中的内容,命令如下。
[root@RedHat opt]# rm -rf *
[root@RedHat opt]# cd
[root@RedHat ~]# ls -lh /opt/
总用量 0