ACL,是 Access Control List(访问控制列表)的缩写,在 Linux 系统中, ACL 可实现对单一用户设定访问文件的权限。也可以这么说,设定文件的访问权限,除了用传统方式(3 种身份搭配 3 种权限),还可以使用 ACL 进行设定。

设定 ACl 权限,常用命令有 2 个,分别是 setfacl 和 getfacl 命令,前者用于给指定文件或目录设定 ACL 权限,后者用于查看是否配置成功。

getfacl 命令用于查看文件或目录当前设定的 ACL 权限信息。该命令的基本格式为:
[root@localhost ~]# getfacl 文件名
getfacl 命令的使用非常简单,且常和 setfacl 命令一起搭配使用。

setfacl 命令可直接设定用户或群组对指定文件的访问权限。此命令的基本格式为:
[root@localhost ~]# setfacl 选项 文件名
表 1 罗列出了该命令可以使用的所用选项及功能。

表 1 setfacl 命令选项及用法

选项 功能
-m 参数 设定 ACL 权限。如果是给予用户 ACL 权限,参数则使用 “u:用户名:权限” 的格式,例如 setfacl -m u:st:rx /project 表示设定 st 用户对 project 目录具有 rx 权限;如果是给予组 ACL 权限,参数则使用 “g:组名:权限” 格式,例如 setfacl -m g:tgroup:rx /project 表示设定群组 tgroup 对 project 目录具有 rx 权限。
-x 参数 删除指定用户(参数使用 u:用户名)或群组(参数使用 g:群组名)的 ACL 权限,例如 setfacl -x u:st /project 表示删除 st 用户对 project 目录的 ACL 权限。
-b 删除所有的 ACL 权限,例如 setfacl -b /project 表示删除有关 project 目录的所有 ACL 权限。
-d 设定默认 ACL 权限,命令格式为 “setfacl -m d:u:用户名:权限 文件名”(如果是群组,则使用 d:g:群组名:权限),只对目录生效,指目录中新建立的文件拥有此默认权限,例如 setfacl -m d:u:st:rx /project 表示 st 用户对 project 目录中新建立的文件拥有 rx 权限。
-R 递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效,命令格式为 “setfacl -m u:用户名:权限 -R 文件名”(群组使用 g:群组名:权限),例如 setfacl -m u:st:rx -R /project 表示 st 用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。
-k 删除默认 ACL 权限。

setfacl -m:给用户或群组添加 ACL 权限

  1. [root@bogon ~]# touch /home/test.txt
  2. [root@bogon ~]# ll /home/test.txt
  3. -rw-r--r--. 1 root root 0 8 15 10:13 /home/test.txt
  4. [root@bogon ~]# getfacl /home/test.txt
  5. getfacl: Removing leading '/' from absolute path names
  6. # file: home/test.txt
  7. # owner: root
  8. # group: root
  9. user::rw-
  10. group::r--
  11. other::r--
  12. [root@bogon ~]# setfacl -m u:alice:rw /home/test.txt // 给用户alice设置读写权限
  13. [root@bogon ~]# getfacl /home/test.txt
  14. getfacl: Removing leading '/' from absolute path names
  15. # file: home/test.txt
  16. # owner: root
  17. # group: root
  18. user::rw-
  19. user:alice:rw-
  20. group::r--
  21. mask::rw-
  22. other::r--
[root@bogon ~]# setfacl -m user:jack:rwx /home/test.txt //给用户jack设置读写权限
[root@bogon ~]# getfacl /home/test.txt
getfacl: Removing leading '/' from absolute path names
# file: home/test.txt
# owner: root
# group: root
user::rw-
user:alice:rw-
user:jack:rwx
group::r--
mask::rwx
other::r--


[root@bogon ~]# setfacl -m group:hr:rw /home/test.txt //给组hr设置读写权限
[root@bogon ~]# getfacl /home/test.txt
getfacl: Removing leading '/' from absolute path names
# file: home/test.txt
# owner: root
# group: root
user::rw-
user:alice:rw-
user:jack:rwx
group::r--
group:hr:rw-
mask::rwx
other::r--
[root@bogon ~]# setfacl -m g:it:rw /home/test.txt //给组it设置读写权限
[root@bogon ~]# man getfacl
[root@bogon ~]# getfacl /home/test.txt
getfacl: Removing leading '/' from absolute path names
# file: home/test.txt
# owner: root
# group: root
user::rw-
user:alice:rw-
user:jack:rwx
group::r--
group:hr:rw-
group:it:rw-
mask::rwx
other::r--
[root@bogon ~]# setfacl -m user:alice:- /home/test.txt //给用户alice设置没有权限
[root@bogon ~]# getfacl /home/test.txt
getfacl: Removing leading '/' from absolute path names
# file: home/test.txt
# owner: root
# group: root
user::rw-
user:alice:---
user:jack:rwx
group::r--
group:hr:rw-
group:it:rw-
mask::rwx
other::r--

[root@bogon ~]# setfacl -x user:alice /home/test.txt //移除用户alice的权限
[root@bogon ~]# getfacl /home/test.txt
getfacl: Removing leading '/' from absolute path names
# file: home/test.txt
# owner: root
# group: root
user::rw-
user:jack:rwx
group::r--
group:hr:rw-
group:it:rw-
mask::rwx
other::r--

setfacl -d:设定默认 ACL 权限

默认 ACL 权限的作用是,如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。需要注意的是,默认 ACL 权限只对目录生效。
待补充

setfacl -R:设定递归 ACL 权限

递归 ACL 权限指的是父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。

[root@localhost project]# setfacl -m u:st:rx -R project
[root@localhost project]# ll
总用量 8
-rw-r-xr--+ 1 root root 01月19 05:20 abc
-rw-rwx--+ 1 root root 01月19 05:33 bcd
drwxr-xr-x+ 2 root root 4096 1月19 05:20 d1
drwxrwx---+ 2 root root 4096 1月19 05:33 d2
#abc和d1也拥有了ACL权限

注意,默认 ACL 权限指的是针对父目录中后续建立的文件和目录会继承父目录的 ACL 权限;递归 ACL 权限指的是针对父目录中已经存在的所有子文件和子目录会继承父目录的 ACL 权限。

setfacl -x:删除指定的 ACL 权限

使用 setfacl -x 命令,可以删除指定的 ACL 权限。

[root@localhost /]# setfacl -x u:st project
#删除指定用户和用户组的ACL权限
[root@localhost /]# getfacl project
# file:project
# owner: root
# group: tgroup
user::rwx
group::rwx
group:tgroup2:rwx
mask::rwx
other::---
#st用户的权限已被删除

setfacl -b:删除指定文件的所有 ACL 权限

此命令可删除所有与指定文件或目录相关的 ACL 权限。

[root@localhost /]# setfacl -b project
#会删除文件的所有ACL权限
[root@localhost /]# getfacl project
#file: project
#owner: root
# group: tgroup
user::rwx
group::rwx
other::---
#所有ACL权限已被删除

复制ACL权限

[root@bogon ~]# touch file1 file2
[root@bogon ~]# setfacl -m u:alice:rw,u:hulk:rwx file1
[root@bogon ~]# setfacl -m g:hr:rw,g:it:r file1
[root@bogon ~]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:alice:rw-
user:hulk:rwx
group::r--
group:hr:rw-
group:it:r--
mask::rwx
other::r--
[root@bogon ~]# man setfacl
[root@bogon ~]# getfacl file1 | setfacl --set-file=- file2 // 将file1的acl权限复制给file2
[root@bogon ~]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
user:alice:rw-
user:hulk:rwx
group::r--
group:hr:rw-
group:it:r--
mask::rwx
other::r--