在上一节的学习中,您了解了什么是ACL权限,以及如何将Linux系统设置为打开ACL权限。 在本节中,您将学习ACL如何设置文件访问权限的具体方法。
设置ACl权限。 常见命令有setfacl和getfacl两种,前者用于为指定的文件或目录设置ACl权限,后者用于验证是否成功配置。
getfacl命令显示当前在文件或目录中设置的ACL权限信息。 命令的基本格式如下:
[root@localhost ~]# getfacl文件名
使用getfacl命令非常简单,经常与setfacl命令一起使用。
setfacl命令直接设置用户或组对指定文件的访问权限。 此命令的基本格式如下:
[根@ localhost~] # setfacl选项文件名
表1列出了此命令可用的选项和功能。
表1 setfacl命令的选项和用法
选项
功能
-m参数
设置ACL权限。 授予用户ACL权限时,参数使用“u:用户名:权限”的格式。 例如,setfacl-mu : ST : rx/project表示将ST用户设置为对项目目录具有rx权限。 授予组ACL权限时,参数使用“g:组名:权限”格式。 例如,setfacl-mg : tgroup : rx/project表示组t group对项目目录具有rx权限。
-x参数
setfacl-x u : st /项目意味着删除ST用户对项目目录的ACL权限。
-b
删除所有ACL权限例如setfacl -b /project )将删除项目目录的所有ACL权限。
-d
设置默认ACL权限“setfacl -m d:u:用户名:权限文件名”对于组,为d:g:组名3360权限) ) ),然后在目录上单击例如setfacl -m d:u:
-R
递归设置ACL权限后,您设置的ACL权限将对目录下的所有子文件有效。 命令格式为“setfacl -m u:用户名3360权限-R文件名”组使用g:组名:权限),例如setfacl-mu : ST 360 rx-r/pro
-k
删除默认的ACL权限。
setfacl -m :向用户或组添加ACL权限
回到上一节的案例,解决办法如下。
老师使用root用户,并且作为/project的所有者对项目目录具有rwx权限
假设您创建了一个新的t组组,并且作为项目目录的所属组,包括此类所有类的学员,只有zhangsan和lisi对项目具有rwx权限
将其他用户访问项目目录的权限设置为0。
对于试听学员st,设定ACL权限,使该用户对项目具有rx权限。
具体的设定命令如下。
[ root @ localhost~~ ] # useradd zangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# useradd st
[ root @ localhost~~ ] # groupadd t group
[ root @ localhost~] # mkdir/project
[ root @ localhost~] # chown root : t group/project
[ root @ localhost~] # chmod 770 /项目
[ root @ localhost~] # ll-d /项目
dw xrwx—- 2根组4096 apr 1612:55 /项目
#这时,st学员来试听了。 你怎么给她分配权限
[ root @ localhost~] # setfacl-mu : ST : rx/project
#向用户st授予r-x权限,使用“u:用户名:权限”格式
[root@localhost /]# cd /
[ root @ localhost/] # ll-d /项目
rwx rwx—- 2根组4096 apr 1612:55/proje
ct
#如果查询时会发现,在权限位后面多了一个”+”,表示此目录拥有ACL权限
[root@localhost /]# getfacl project
#查看/prpject目录的ACL权限
#file:project
#owner:root
#group:tgroup
user::rwx
user:st:r-x
group::rwx
mask::rwx
other::—
可以看到,通过设定 ACL 权限,我们可以单独给 st 用户分配 r-x 权限,而无需给 st 用户设定任何身份。
同样的道理,也可以给用户组设定 ACL 权限,例如:
[root@localhost /]# groupadd tgroup2
#添加新群组
[root@localhost /]# setfacl -m g:tgroup2:rwx project
#为组tgroup2纷配ACL权限
[root@localhost /]# ll -d project
drwxrwx—+ 2 root tgroup 4096 1月19 04:21 project
#属组并没有更改
[root@localhost /]# getfacl project
#file: project
#owner: root
#group: tgroup
user::rwx
user:st:r-x
group::rwx
group:tgroup2:rwx
mask::rwx
other::—
setfacl -d:设定默认 ACL 权限
既然已经对 project 目录设定了 ACL 权限,那么,如果在这个目录中新建一些子文件和子目录,这些文件是否会继承父目录的 ACL 权限呢?执行以下命令进行验证:
[root@localhost /]# cd project
[root@localhost project]# touch abc
[root@localhost project]# mkdir d1
#在/project目录中新建了abc文件和d1目录
[root@localhost project]#ll
总用量4
-rw-r–r– 1 root root 01月19 05:20 abc
drwxr-xr-x 2 root root 4096 1月19 05:20 d1
可以看到,这两个新建立的文件权限位后面并没有 “+”,表示它们没有继承 ACL 权限。这说明,后建立的子文件或子目录,并不会继承父目录的 ACL 权限。
当然,我们可以手工给这两个文件分配 ACL 权限,但是如果在目录中再新建文件,都要手工指定,则显得过于麻烦。这时就需要用到默认 ACL 权限。
默认 ACL 权限的作用是,如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。需要注意的是,默认 ACL 权限只对目录生效。
例如,给 project 文件设定 st 用户访问 rx 的默认 ACL 权限,可执行如下指令:
[root@localhost /]# setfacl -m d:u:st:rx project
[root@localhost project]# getfacl project
# file: project
# owner: root
# group: tgroup
user:: rwx
user:st:r-x
group::rwx
group:tgroup2:rwx
mask::rwx
other::—
default:user::rwx
default:user:st:r-x
default:group::rwx
default:mask::rwx
default:other::—
[root@localhost /]# cd project
[root@localhost project]# touch bcd
[root@localhost project]# mkdir d2
#新建子文件和子目录
[root@localhost project]# ll 总用量8
-rw-r–r– 1 root root 01月19 05:20 abc
-rw-rw—-+ 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
#新建的bcd和d2已经继承了父目录的ACL权限
大家发现了吗?原先的 abc 和 d1 还是没有 ACL 权限,因为默认 ACL 权限是针对新建立的文件生效的。
对目录设定的默认 ACL 权限,可直接使用setfacl -k 命令删除。例如:
[root@localhost /]# setfacl -k project
通过此命令,即可删除 project 目录的默认 ACL 权限,读者可自行通过 getfacl 命令查看。
setfacl -R:设定递归 ACL 权限
递归 ACL 权限指的是父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。
例如,给 project 目录设定 st 用户访问权限为 rx 的递归 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 权限,例如,删除前面建立的 st 用户对 project 目录的 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 权限。例如,现在我们删除一切与 project 目录相关的 ACL 权限,执行命令如下:
[root@localhost /]# setfacl -b project
#会删除文件的所有ACL权限
[root@localhost /]# getfacl project
#file: project
#owner: root
# group: tgroup
user::rwx
group::rwx
other::—
#所有ACL权限已被删除