五分钟学会 Linux ACL 权限的全部内容

ACL 是什么

ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。

本文的演示环境为 ubuntu 16.04。

ACL有什么用

既然是作为UGO权限管理的补充,ACL自然要有UGO办不到或者很难办到的本事,例如:

  1. 可以针对用户来设置权限
  2. 可以针对用户组来设置权限
  3. 子文件/目录继承父目录的权限

检查是否支持ACL

ACL需要Linux内核和文件系统的配合才能工作,当前我们能见到的大多数Linux发行版本默认都是支持的。但最好还是能够先检查一下:

sudo tune2fs -l /dev/sda1 |grep "Default mount options:" Default mount options: user_xattr acl

我们能够看到默认情况下(Default mount options:)已经加入 acl 支持了。

如何设置ACL

我们可以使用setfacl和getfacl命令来设置或观察文件/目录的acl权限。

setfacl

参数不多,直接列出来了:

getfacl

getfacl 文件/目录名

下面我们通过一些示例来演示 ACL 权限的基本用法。

针对用户来设置权限

笔者系统中的当前用户是 nick,再创建两个用户 tester 和 tester1 用来进行测试:

$ sudo adduser tester $ sudo adduser tester1

创建文件 aclfile,检查其默认的权限信息:

把用户切换为 tester,发现没有写文件的权限:

这是因为 other 没有写 aclfile 文件的权限。

下面我们为 tester 用户赋予读写 aclfile 文件的权限:

$ setfacl -m u:tester:rw aclfile

修改成功后再次以 tester 用户的身份向 aclfile 文件写入数据,这次已经可以正常写入了。查看 aclfile 文件的权限:

$ ll aclfile

貌似并没有发生什么变化,只是在描述权限的地方多出了一个 “+” 号。下面再看看 acl 权限:

$ getfacl aclfile

多出了一些信息,其中比较重要的是 user:tester:rw-,就是它让用户 tester 具有了读写 aclfile 的权限。

针对用户组来设置权限

和针对用户的设置几乎一样,只是把小写的 u 换成小写的 g 就行了。

子文件/目录继承父目录的权限

这是一个很棒的例子,它能让我们创建的子文件或者子文件夹继承父文件夹的权限设置!

$ mkdir mydir $ ll -d mydir $ setfacl -m d:u:tester:rwx mydir $ getfacl mydir

注意参数 d 在这里起到了决定性的作用。下面是设置后的 mydir 目录的权限属性:

这次多出了一些以 default 开头的行,这些 default 权限信息只能在目录上设置,然后会被目录中创建的文件和目录继承。下面分别在 mydir 目录下创建文件 testfile 和目录 testdir,并查看它们的 acl 权限:

$ touch testfile $ mkdir testdir $ getfacl testfile $ getfacl testdir

从上图可以看到文件 testfile 继承了父目录的 acl 权限,因此用户 tester 对它有读写权限。下面再看看 testdir 目录:

从图中可以看出,testdir 目录不仅继承了 tester 的访问权限,还继承了父目录上的 default 权限。也就是说我们通过这种方式设置在目录上的权限可以被子目录递归的继承下去。

更改 ACL 权限

-m 选项其实是在更改文件和目录的 ACL 权限

  • 当一个用户或组的 ACL 权限不存在时,-m 选项执行的是添加操作,
  • 如果一个用户或组的 ACL 权限已经存在时,-m 选项执行的是更新操作。

我们重新创建一个 aclfile 文件,通过下面的命令设置 tester 用户对它的访问权限:

$ 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

这次是新添加了 group tester1 的权限,并且没有影响 tester 用户的权限。

–set 选项会先清除掉原有的 ACL 权限,然后添加新的权限

我们接着设置 aclfile 文件的 ACL 权限:

$ setfacl --set u::rw,u:tester2:rwx,g::r,o::- aclfile

需要注意的是一定要包含 UGO 权限的设置,不能象 -m 一样只包含 ACL 权限。o::- 是另一个需要注意的地方,其完整的写法是 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 选项删除 group 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 权限全都恢复回来了!

来源:sparkdev www.cnblogs.com/sparkdev/p/5536868.html

*声明:推送内容及图片来源于网络,部分内容会有所改动,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

- END -


原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2018-10-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏smy

对比cp和scp命令 将数据从一台linux服务器复制到另一台linux服务器

cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复...

6725
来自专栏琦小虾的Binary

Ubuntu环境如何上传项目到GitHub网站?

Ubuntu环境如何上传项目到GitHub网站? 之前笔者写了一篇《CMake学习笔记(三)——以笔者的Robosub竞赛为例》的博客。博客中笔者以自己的项目为...

2958
来自专栏ytkah

finecms如何批量替换文章中的关键词?

  Finecms批量替换文章关键词要怎么操作呢,比如把关键词A换为B?Finecms是免费开源无商业限制的内容管理系统,个人在维护,但二次开发很灵活,我们可以...

3423
来自专栏技术专栏

Zookeeper 在linux&mac下 安装配置

详情参考 http://zookeeper.apache.org/doc/r3.4.5/zookeeperStarted.html

4012
来自专栏云计算教程系列

如何使用Nginx创建临时和永久重定向

HTTP重定向是将一个域或地址指向另一个域或地址的方式。有几种不同的重定向,每种重定向都意味着与客户端浏览器不同。两种最常见的类型是临时重定向和永久重定向。

1653
来自专栏编程

Go语言·不常用的Go命令详解

作者:孙飞撩技术 链接:http://www.jianshu.com/p/46c268e7a149 來源:简书 共3329字,阅读需8分钟 迁移自CSDN: $...

2575
来自专栏阮一峰的网络日志

Linux的五个查找命令

在Linux中,有很多方法可以做到这一点。国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条。大多数程序员,可能经常使用其中的2到3条,对这5条...

1371
来自专栏大大的微笑

Redis初步了解

①. 到这里下载自己需要的版本 ,http://download.redis.io/releases/,我的版本是2.8.7 ②. 解压下载的安装包到自己想要存...

2526
来自专栏北京马哥教育

Linux中find命令用法全汇总,看完就没有不会用的!

糖豆贴心提醒,本文阅读时间7分钟 Linux 查找命令是Linux系统中最重要和最常用的命令之一。查找用于根据与参数匹配的文件指定的条件来搜索和查找文件和目录...

3153
来自专栏JavaEdge

Error running Tomcat8: Address localhost:1099 is already in use

这明显是1099端口已经被占用,解决办法如下: 第一步,命令提示符号,执行命令:

1651

扫码关注云+社区

领取腾讯云代金券