蚊章汇 - setfacl
type: channel
link: https://linuxcn.bwsl.wang/tag/setfacl/
items: 使用 ACL 设置用户访问指定文件/目录的权限

使用 ACL 设置用户访问指定文件/目录的权限
type: item
date: 2018-01-05T17:10:00+08:00
description: 当提到文件和目录的权限时，你的第一反应可能是“属主/群组/其它”权限。 这些权限可以通过 chmod、 chown 等命令来修改。文件和目录都有属主 (文件所有者 )、群组 (所属组) 以及其它权限，这些权限构成一个集合。 然而这些权限集合有它的局限性，无法做到为不同的用户设置不同的权限。Linux 对文件和目录有以下默认权限。文件 -> 644 -> -rw-r-r- （所有者有读写权限，组成员有只读权限， 其他人也只有读权限）目录 -> 755 -> drwxr-xr-x （所有者有读、写和执行权限，组成员有读和执行的权限，其他人也有读和执行的权限）比如： 默认情况下，所有者可以访问和编辑他们自己主目录中的文件， 也可以访问相关同组人的文件，但他们不能修改这些文件，因为组成员没有写权限，而且让组成员有写权限也是不明智的。 基于同样的原因，他/她也不能修改其他人的文件。 然而在某些情况下，多个用户想要修改同一个文件， 那该怎么办呢？假设有个名叫 magi 的用户，他想要修改 httpd.conf 文件怎么办呢？ 这个文件是归 root 用户所有的，这样如何授权呢？ 为了解决这种情况， 访问控制列表 Access Control List （ACL）诞生了。什么是 ACL？ACL 表示 访问控制列表 Access Control List （ACL），它为文件系统提供了附加的、更具有弹性的权限机制。 它被设计来为补充 UNIX 文件权限机制。 ACL 允许你赋予任何某用户/组访问某项资源的权限。 setfacl 与 getfacl 命令会帮助你管理 ACL 而不会有任何麻烦。什么是 setfacl？setfacl 用于设置文件和目录的 ACL。什么 getfacl？getfacl - 获取文件的 ACL 。对于每个文件， getfacl 都会显示文件名、文件所有者、所属组以及ACL。 如果目录有默认 ACL， getfacl 也会显示这个默认的 ACL。如何确认是否启用了 ACL？运行 tune2fs 命令来检查是否启用了 ACL。# tune2fs -l /dev/sdb1 | grep options Default mount options: (none) 上面的输出很明显第说明 /dev/sdb1 分区没有启用 ACL。如果结果中没有列出 acl，则你需要在挂载选项中加上 acl。 为了让它永久生效， 修改 /etc/fstab 中 /app 这一行成这样：# more /etc/fstab UUID=f304277d-1063-40a2-b9dc-8bcf30466a03 / ext4 defaults 1 1 /dev/sdb1 /app ext4 defaults，acl 1 1 或者，你也可以使用下面命令将其添加道文件系统的超级块中：# tune2fs -o +acl /dev/sdb1 现在，通过运行以下命令来动态修改选项：# mount -o remount,acl /app 再次运行 tune2fs 命令来看选项中是否有 acl 了：# tune2fs -l /dev/sdb1 | grep options Default mount options： acl 嗯，现在 /dev/sdb1 分区中有 ACL 选项了。如何查看默认的 ACL 值要查看文件和目录默认的 ACL 值，可以使用 getfacl 命令后面加上文件路径或者目录路径。 注意， 当你对非 ACL 文件/目录运行 getfacl 命令时， 则不会显示附加的 user 和 mask 参数值。# getfacl /etc/apache2/apache2.conf # file： etc/apache2/apache2.conf # owner： root # group： root user::rw- group::r-- other::r-- 如何为文件设置 ACL以下面格式运行 setfacl 命令可以为指定文件设置 ACL。在下面的例子中，我们会给 magi 用户对 /etc/apache2/apache2.conf 文件 rwx 的权限。# setfacl -m u:magi:rwx /etc/apache2/apache2.conf 仔细分析起来：setfacl： 命令-m： 修改文件的当前 ACLu： 指明用户magi： 用户名rwx： 要设置的权限/etc/apache2/apache2.conf： 文件名称再查看一次新的 ACL 值：# getfacl /etc/apache2/apache2.conf # file： etc/apache2/apache2.conf # owner： root # group： root u…