
什么是ACL?
ACL的全称是访问控制列表,一个文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供了额外的、更灵活的权限管理机制。它旨在作为UNIX文件权限管理的补充。ACL允许您为任何用户或用户组设置对任何文件/目录的访问权限。
本文的演示环境是ubuntu 16.04。
ACL有什么用?
既然是作为UGO权限管理的补充,ACL自然应该有UGO不会或者不会的技能,比如:
您可以为用户设置权限。
可以为用户组设置权限。
子文件/目录继承父目录的权限。
检查ACL是否受支持。
ACL需要Linux内核和文件系统的配合才能工作,目前我们能看到的大多数Linux发行版都是默认支持的。但是最好先检查一下:
sudo tune2fs -l /dev/sda1 |grep '默认装载选项:'
Defaultmount选项:user_xattracl
我们可以看到默认情况下添加了acl支持(默认挂载选项:)。
如何设置ACL
我们可以使用setfacl和getfacl命令来设置或观察文件/目录的acl权限。
setfacl
参数不多,直接列出来:
getfacl
Getfacl文件/目录名
让我们通过一些例子来演示ACL权限的基本用法。
为用户设置权限。
作者系统中的当前用户是nick,然后为测试创建了两个用户tester和tester1:
$sudo adduser测试器
$sudo添加用户测试1
创建文件aclfile并检查其默认权限信息:
将用户切换到tester,发现没有写文件的权限:
这是因为其他人没有权限写入aclfile文件。
下面,我们给测试者用户读写aclfile的权限:
$ setfacl -m u:tester:rw aclfile
修改成功后,以测试仪用户的身份再次将数据写入aclfile文件。这次可以正常写了。查看aclfile的权限:
$ ll aclfile
好像什么都没变,只是在描述权威的地方多了一个“”。让我们来看看acl权限:
$ getfacl aclfile
还有更多信息,其中最重要的是user:tester:rw-,它赋予用户tester读写aclfile的权限。
为用户组设置权限。
和给用户的设置差不多,把小写U改成小写g就行了。
子文件/目录继承父目录的权限。
这是一个很棒的例子,它可以让我们创建的子文件夹或子文件夹继承父文件夹的权限设置!
$mkdir mydir
$ll -dmydir
$setfacl -md:u:tester:rwx mydir
$getfacl mydir
注意,参数D在这里起着决定性的作用。下面是set mydir目录的权限属性:
这一次,有一些额外的行以default开头。这些默认的权限信息只能在目录中设置,然后会被目录中创建的文件和目录继承。下面,在mydir目录下分别创建文件testfile和目录testdir,并检查它们的acl权限:
$touch测试文件
$mkdir测试目录
$getfacl测试文件
$getfacl测试目录
从上图可以看出,文件testfile继承了父目录的acl权限,所以用户tester对它有读写权限。让我们来看看testdir目录:
从图中可以看出,testdir目录不仅继承了tester的访问权限,还继承了父目录上的默认权限。也就是说,我们这样在目录上设置的权限可以被子目录递归继承。
更改ACL权限
-m选项实际上更改了文件和目录的ACL权限。
当用户或组的ACL权限不存在时,-m选项执行添加操作,
如果用户或组的ACL权限已经存在,则-m选项将执行更新操作。
我们重新创建一个aclfile文件,并通过以下命令设置测试人员用户对它的访问权限:
$ setfacl -m u:tester:rwx aclfile
此时,-m选项正在添加ACL权限。然后,我们修改tester用户的权限,并删除其对aclfile的执行权限:
$ setfacl -m u:tester:rw aclfile
此时,-m选项正在更改现有的ACL权限。接下来,让我们尝试为不同的用户或组设置ACL权限:
$ setfacl -m g:tester1:rwx aclfile
这次新增了tester1组的权限,tester用户的权限不受影响。
-set选项首先清除现有的ACL权限,然后添加新的权限。
然后我们设置aclfile的ACL权限:
$ setfacl - set u:rw,u:tester2:rwx,g:r,o:- aclfile
需要注意的是,必须包括UGO权限的设置,而不仅仅是像-m. O:-这样的ACL权限是另外一个需要注意的点。它的完整写法是other:-,就像u:rw的完整写法是user:rw-。通常我们可以省略“-”,但当功率限制只包含“-”时,至少要保留一个。如果写成O:就会报错。
删除ACL权限
添加了就可以删除。我们可以通过setfacl命令的-x选项删除指定用户或组的acl权限,还可以通过-b选项清除文件和目录上的所有ACL权限。
我们创建一个新的测试文件aclfile,并设置以下ACL权限:
$ setfacl -m u:tester:rwx,u:tester1:rw,g:tester2:rwx aclfile
使用下面的-x选项删除组tester2的ACL权限(注意,在命令中只指定了组的名称,而没有指定权限信息):
$ setfacl -x g:tester2 aclfile
检查结果,发现下图中没有group:tester2的权限信息:
使用下面的-b选项一次删除aclfile上的所有ACL权限:
$ setfacl -b aclfile
-b选项直接清除文件上的所有ACL权限。对于目录来说,这种行为是相同的,因此这里就不做演示了。
备份和恢复ACL权限
常见的文件操作命令,如cp和mv,都支持ACL权限,但cp命令需要添加-p参数。而tar等常用备份工具并不保留目录和文件的ACL权限信息。如果要备份和还原具有ACL权限的文件和目录,可以首先将ACL权限信息备份到文件中,然后使用-restore选项还原该信息。下面演示了ACL权限的保存和恢复。让我们首先创建以下目录结构:
并分别为acldir目录和aclfile文件设置ACL权限:
然后使用以下命令导出acldir目录的ACL权限信息,并保存在文件acldir.acl文件中:
$ getfacl -R acldir acldir.acl
接下来,删除acldir目录的ACL权限:
$ setfacl -R -b acldir
现在,acldir目录及其子文件上的ACL权限已被删除。最后,我们将使用以下命令恢复他们的ACL权限:
$ setfacl - restore acldir.acl
之前删除的ACL权限全部恢复!









