Skip to main content

Linux 用户与权限

Linux ACL权限管理

Linux 的 ACL(Access Control List,访问控制列表)是个超级好用的工具,能让你更灵活地控制文件和目录的权限。相比传统的用户、组、其他三类权限,ACL 允许你给特定的用户或组设置单独的权限,特别适合多人协作或复杂权限管理的场景。

1. 什么是 ACL?

ACL 是一种扩展权限机制,允许你为文件或目录设置更细粒度的访问控制。传统的 Linux 权限(读 r、写 w、执行 x)只支持 owner、group 和 others 三类,而 ACL 可以让你给任意用户或组分配特定的权限。比如,你可以让某个用户只能读某个文件,而另一个用户可以读写,完全不依赖传统的组机制。

ACL 特别适合:

  • 项目需要多个用户或组以不同权限访问同一个文件或目录。
  • 你不想频繁改动文件所属的组或用户。
  • 需要比传统权限更复杂的控制。

2. 检查系统是否支持 ACL

不是所有 Linux 系统默认都启用 ACL,得先确认一下你的文件系统和内核是否支持。常用的文件系统(如 ext4、xfs、btrfs)一般都支持 ACL,但得确保挂载时启用了 ACL 选项。

检查文件系统挂载选项:

mount | grep acl

如果输出里看到类似 /dev/sda1 on / type ext4 (rw,acl,...),说明 ACL 已启用。如果没看到 acl,可能需要手动启用。

启用 ACL(以 ext4 为例,假设挂载点是 /):

sudo mount -o remount,acl /

要永久启用,编辑 /etc/fstab,在对应文件系统的挂载选项里加上 acl,比如:

UUID=your-uuid / ext4 defaults,acl 0 1

确认 ACL 工具已安装(setfacl 和 getfacl 命令):

getfacl --version

如果没装,Debian/Ubuntu 系统可以用:

sudo apt install acl

CentOS/RHEL 系统用:

sudo yum install acl

3. 查看文件的 ACL 权限

getfacl 命令可以查看文件或目录的 ACL 权限。假设有个文件叫 test.txt,运行:

getfacl test.txt

输出可能长这样:

# file: test.txt
# owner: alice
# group: users
user::rw-
user:bob:r-x
group::r--
mask::r-x
other::r--

解释一下:

  • # file:文件名。
  • # owner# group:文件所属用户和组。
  • user::rw-:文件拥有者的权限(读写)。
  • user:bob:r-x:用户 bob 的 ACL 权限(读和执行)。
  • group::r--:所属组的权限(只读)。
  • mask::r-x:ACL 掩码,限制 ACL 权限的最大范围。
  • other::r--:其他用户的权限(只读)。

如果文件没设置 ACL,输出只会显示传统权限。

4. 设置 ACL 权限

setfacl 命令来设置 ACL。基本语法是:

setfacl -m [权限类型]:[对象]:[权限] 文件名
  • -m:表示修改或添加 ACL。
  • 权限类型:u(用户)、g(组)、o(其他)、m(掩码)。
  • 对象:用户名或组名(如果是用户或组)。
  • 权限:r(读)、w(写)、x(执行),可以组合。

4.1 给特定用户设置权限

给用户 bob 设置对 test.txt 的读写权限:

setfacl -m u:bob:rw test.txt

检查结果:

getfacl test.txt

输出会多一行 user:bob:rw-

4.2 给特定组设置权限

给组 developers 设置对 project/ 目录的读和执行权限:

setfacl -m g:developers:rx project/

4.3 设置掩码(mask)

掩码是 ACL 的“最大权限限制”,会影响除 owner 和 other 外的所有 ACL 权限。比如,掩码是 r--,即使你给某个用户设置了 rwx,实际生效的权限只有 r--

设置掩码:

setfacl -m m:r project/

查看效果:

getfacl project/

掩码一般不用手动改,setfacl 会根据你设置的权限自动调整。

5. 递归设置 ACL

如果想给目录及其下所有文件和子目录设置 ACL,用 -R 选项。比如,给 project/ 及其内容设置 bob 的读写权限:

setfacl -R -m u:bob:rw project/

6. 默认 ACL(新文件自动继承)

目录可以设置默认 ACL(default ACL),让新创建的文件或子目录自动继承指定的 ACL。默认 ACL 不会影响现有文件。

设置默认 ACL:

setfacl -m d:u:bob:rw project/

检查默认 ACL:

getfacl project/

输出会包含类似 default:user:bob:rw- 的行。

现在,在 project/ 里新建文件或目录,都会自动带上 bobrw 权限。

7. 删除 ACL 权限

7.1 删除特定 ACL

删除用户 bob 的 ACL:

setfacl -x u:bob test.txt

-x 表示删除指定的 ACL 条目。

7.2 删除所有 ACL

删除文件的所有 ACL,恢复到传统权限:

setfacl -b test.txt

-b 会清除所有 ACL 条目(包括默认 ACL)。

7.3 删除默认 ACL

只删除目录的默认 ACL:

setfacl -k project/

8. ACL 和传统权限的交互

ACL 和传统权限(chmod 设置的权限)会互相影响:

  • 传统权限的 group 权限会被 ACL 的掩码(mask)覆盖。
  • 如果你用 chmod 改权限,可能会影响 ACL 的掩码。

比如,文件当前掩码是 rwx,你运行:

chmod g=r test.txt

这会把掩码改成 r--,导致组和用户的 ACL 权限被限制到只读。

查看文件是否有 ACL:

ls -l test.txt

如果有 ACL,输出会显示一个 + 号,比如:

-rw-r-xr--+ 1 alice users 0 Aug 12 12:00 test.txt

9. 备份和恢复 ACL

ACL 信息不会被常规备份工具(如 cptar)自动保存,得用专门的工具。

备份 ACL:

getfacl -R project/ > acl_backup.txt

恢复 ACL:

setfacl --restore=acl_backup.txt

10. 常见问题和注意事项

  • 文件系统支持:确保文件系统支持 ACL(ext4、xfs 等都行,fat32 不行)。
  • 挂载选项:ACL 需要在挂载时启用,否则 setfacl 会报错。
  • 掩码的影响:总是注意掩码对权限的限制。
  • 工具支持:有些老工具(比如 ls)可能不完整显示 ACL,得用 getfacl
  • 权限冲突:ACL 和传统权限冲突时,掩码会起决定作用。