一.学习的内容
前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的,能够对很多人同时生效。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准地派发权限。
另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL权限;若针对文件设置了ACL,则文件不再继承其所在目录的ACL权限。
1、setfacl命令
setfacl命令用于设置文件的ACL权限规则。 命令格式:setfacl [参数] 文件名称
ACL权限提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制。使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。setfacl命令的常用参数如表2所示。
参数 | 作用 |
-m | 修改权限 |
-M | 从文件中读取权限 |
-x | 删除某个权限 |
-b | 删除全部权限 |
-R | 递归子目录 |
例如,我们原本是无法进入/root目录中的:

现在为普通用户单独设置一下权限,随后再切换到这位普通用户的身份下,现在能正常进入了:

但是现在有这样一个小问题—怎么去查看文件是否设置了ACL呢?常用的ls命令是看不到ACL信息的,但是却可以看到文件权限的最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL。

2、getfacl命令
getfacl命令用于查看文件的ACL权限规则。命令格式:getfacl [参数] 文件名称
下面使用getfacl命令显示在root管理员家目录上设置的所有ACL信息:

ACL权限还可以针对某个用户组进行设置。例如,允许某个组的用户都可以读写/etc/fstab文件:

要清空所有ACL权限,请用-b参数;要删除某一条指定的权限,就用-x参数:

ACL权限的设置都是立即且永久生效的,不需要再编辑什么配置文件,这一点特别方便。但是,这也带来了一个安全隐患。如果我们不小心设置错了权限,就会覆盖掉文件原始的权限信息,并且永远都找不回来了。
操作前备份一下,总是好的习惯
例如,在备份 /home 目录上的ACL权限时,可使用 -R 递归参数,这样不仅能够把目录本身的权限进行备份,还能将里面的文件权限也自动备份。另外,再加上第3章学习过的输出重定向操作,可以轻松实现权限的备份。

ACL权限的恢复也很简单,使用的是 --restore 参数。由于在备份时已经指定是对/home目录进行操作,所以不需要写对应的目录名称,它能够自动找到要恢复的对象。
直接使用 setfacl --restore backup.acl 命令会出现报错,如下图所示:

此时,我们需要进入到根目录下执行刚才的命令,并把备份文件路径改为绝对路径。

下面,来实战以下是否会恢复ACL权限,先查看 /home 文件的ACL权限规则,之后再使用恢复权限命令,最后再次查看 /home文件的ACL权限。
