9.9 Linux ACL权限设置(setfacl和getfacl)

简介: 通过上一节的学习,我们知道了什么是 ACL 权限,也了解了如何配置 Linux 系统使其开启 ACL 权限,本节来学习 ACL 设定文件访问权限的具体方法。

通过上一节的学习,我们知道了什么是 ACL 权限,也了解了如何配置 Linux 系统使其开启 ACL 权限,本节来学习 ACL 设定文件访问权限的具体方法。

设定 ACl 权限,常用命令有 2 个,分别是 setfacl 和 getfacl 命令,前者用于给指定文件或目录设定 ACL 权限,后者用于查看是否配置成功。

getfacl 命令用于查看文件或目录当前设定的 ACL 权限信息。该命令的基本格式为:

[root@localhost ~]# getfacl 文件名

getfacl 命令的使用非常简单,且常和 setfacl 命令一起搭配使用。

setfacl 命令可直接设定用户或群组对指定文件的访问权限。此命令的基本格式为:

[root@localhost ~]# setfacl 选项 文件名

表 1 罗列出了该命令可以使用的所用选项及功能。

选项 功能
-m 参数 设定 ACL 权限。如果是给予用户 ACL 权限,参数则使用 "u:用户名:权限" 的格式,例如 setfacl -m u:st:rx /project 表示设定 st 用户对 project 目录具有 rx 权限;如果是给予组 ACL 权限,参数则使用 "g:组名:权限" 格式,例如 setfacl -m g:tgroup:rx /project 表示设定群组 tgroup 对 project 目录具有 rx 权限。
-x 参数 删除指定用户(参数使用 u:用户名)或群组(参数使用 g:群组名)的 ACL 权限,例如 setfacl -x u:st /project 表示删除 st 用户对 project 目录的 ACL 权限。
-b 删除所有的 ACL 权限,例如 setfacl -b /project 表示删除有关 project 目录的所有 ACL 权限。
-d 设定默认 ACL 权限,命令格式为 "setfacl -m d:u:用户名:权限 文件名"(如果是群组,则使用 d:g:群组名:权限),只对目录生效,指目录中新建立的文件拥有此默认权限,例如 setfacl -m d:u:st:rx /project 表示 st 用户对 project 目录中新建立的文件拥有 rx 权限。
-R 递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效,命令格式为 "setfacl -m u:用户名:权限 -R 文件名"(群组使用 g:群组名:权限),例如 setfacl -m u:st:rx -R /project 表示 st 用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。
-k 删除默认 ACL 权限。

setfacl -m:给用户或群组添加 ACL 权限

回归上一节案例,解决方案如下:

  • 老师使用 root 用户,并作为 /project 的所有者,对 project 目录拥有 rwx 权限;
  • 新建 tgroup 群组,并作为 project 目录的所属组,包含本班所有的班级学员(假定只有 zhangsan 和 lisi),拥有对 project 的 rwx 权限;
  • 将其他用户访问 project 目录的权限设定为 0(也就是 ---)。
  • 对于试听学员 st 来说,我们对其设定 ACL 权限,令该用户对 project 拥有 rx 权限。

具体的设置命令如下:

[root@localhost ~]# useradd zhangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# useradd st
[root@localhost ~]# groupadd tgroup <-- 添加需要试验的用户和用户组,省略设定密码的过程
[root@localhost ~]# mkdir /project <-- 建立需要分配权限的目录
[root@localhost ~]# chown root:tgroup /project <-- 改变/project目录的所有者和所属组
[root@localhost ~]# chmod 770 /project <-- 指定/project目录的权限
[root@localhost ~]# ll -d /project
drwxrwx---. 2 root tgroup 4096 Apr 16 12:55 /project
\#这时st学员来试听了,如何给她分配权限
[root@localhost ~]# setfacl -m u:st:rx /project
\#给用户st赋予r-x权限,使用"u:用户名:权限" 格式
[root@localhost /]# cd /
[root@localhost /]# ll -d /project
drwxrwx---+ 2 root tgroup 4096 Apr 16 12:55 /project
\#如果查询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
[root@localhost /]# getfacl project
\#查看/prpject目录的ACL权限
\#file:project <--文件名
\#owner:root <--文件的所有者
\#group:tgroup <--文件的所属组
user::rwx <--用户名栏是空的,说明是所有者的权限
user:st:r-x <--用户st的权限
group::rwx <--组名栏是空的,说明是所属组的权限
mask::rwx <--mask权限
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 <-用户组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字段
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权限已被删除
目录
相关文章
|
1月前
|
Linux Shell
Linux系统文件默认权限
Linux系统文件默认权限
|
8天前
|
Linux 数据安全/隐私保护
linux特殊权限!!
本文介绍了Linux系统中的特殊权限,包括suid、sgid和sbit。suid使普通用户在执行特定命令时获得root权限;sgid使用户在创建文件时继承目录的用户组权限;sbit确保用户只能删除自己在共享目录中创建的文件。此外,文章还讲解了chattr和lsattr命令,用于更改和查看文件的扩展属性,以及umask的概念和计算方法,帮助理解文件和目录的默认权限。
25 1
linux特殊权限!!
|
1天前
|
监控 Oracle 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第8天】在 Linux 平台设置 Oracle 开机自启动有多种方法,本文以 CentOS 为例,介绍了两种常见方法:使用 `rc.local` 文件(较简单但不推荐用于生产环境)和使用 `systemd` 服务(推荐)。具体步骤包括编写启动脚本、赋予执行权限、配置 `rc.local` 或创建 `systemd` 服务单元文件,并设置开机自启动。通过 `systemd` 方式可以更好地与系统启动过程集成,更规范和可靠。
|
2天前
|
Oracle Ubuntu 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第7天】本文介绍了 Linux 系统中服务管理机制,并详细说明了如何在使用 systemd 和 System V 的系统上设置 Oracle 数据库的开机自启动。包括创建服务单元文件、编辑启动脚本、设置开机自启动和启动服务的具体步骤。最后建议重启系统验证设置是否成功。
|
12天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
60 3
|
1月前
|
运维 监控 安全
Linux_权限理解(详细PLUS)
【10月更文挑战第3天】本文介绍了Linux系统中的权限管理基础,包括文件系统对象与权限关联、权限的继承性、字符与数字表示法的解读,以及用户、组与权限的动态交互。详细解析了`chmod`命令的高级用法和权限修改的风险,探讨了SUID、SGID和Sticky Bit等特殊权限的作用机制,并提出了基于角色的权限分配和定期权限审计的最佳实践。
57 11
|
1月前
|
Ubuntu Linux
Linux实践|设置静态 IP 地址
Linux实践|设置静态 IP 地址
55 0
Linux实践|设置静态 IP 地址
|
1月前
|
Linux 应用服务中间件 nginx
Linux下权限设置之suid、sgid、sticky
Linux下权限设置之suid、sgid、sticky
|
1月前
|
Linux 数据安全/隐私保护 Windows
Linux_权限理解(详细PLUS
Linux_权限理解(详细PLUS
|
1月前
|
网络协议 Linux 网络安全
【Linux】用户和权限及实用操作------迅速了解用户和权限及其实用操作
【Linux】用户和权限及实用操作------迅速了解用户和权限及其实用操作