当前位置:首页>Linux>《Linux 权限除了chmod和chown外ACL进阶玩法是你必须要掌握的》

《Linux 权限除了chmod和chown外ACL进阶玩法是你必须要掌握的》

  • 2026-10-10 13:29:27
《Linux 权限除了chmod和chown外ACL进阶玩法是你必须要掌握的》

Linux 权限除了chmod和chown外ACL进阶玩法是你必须要掌握的

在Linux文件夹或文件需要对某些用户和组授予相关权限,如果你直接使用chmod是没法对权限精细化管理的,这时就需要用到ACL,setfacl 是设置访问控制列表(ACL)的命令,可以更灵活地管理文件和目录权限,支持为多个用户和组设置不同的权限。以下是使用 setfacl 为组设置文件夹权限的详细指南:

1. 基本语法

# 为组设置权限
setfacl -m g:组名:权限 目录名

# 查看ACL权限
getfacl 目录名

# 递归设置(包括子目录和文件)
setfacl -R -m g:组名:权限 目录名

2. 设置组权限的示例

2.1 基本权限设置

# 为 developers 组添加读写执行权限
setfacl -m g:developers:rwx /data/project

# 为 developers 组添加读写权限(无执行)
setfacl -m g:developers:rw /data/project

# 为多个组设置不同权限
setfacl -m g:developers:rwx,g:managers:rx /data/project

2.2 设置默认ACL(新文件自动继承)

# 为现有文件设置ACL
setfacl -m g:developers:rwx /data/project

# 设置默认ACL(新创建的文件继承此ACL)
setfacl -m d:g:developers:rwx /data/project

# 同时设置当前ACL和默认ACL
setfacl -m g:developers:rwx,d:g:developers:rwx /data/project

2.3 递归设置ACL

# 递归设置ACL(现有文件和目录)
setfacl -R -m g:developers:rwx /data/project

# 递归设置默认ACL
setfacl -R -m d:g:developers:rwx /data/project

# 一次性设置当前和默认ACL(递归)
setfacl -R -m g:developers:rwx,d:g:developers:rwx /data/project

3. 查看ACL权限

# 查看ACL
getfacl /data/project

# 示例输出:
# file: /data/project
# owner: user1
# group: user1
# user::rwx
# group::r-x
# group:developers:rwx  # ← 这是添加的ACL
# mask::rwx
# other::r--

4. 常用组合示例

4.1 完整协作目录设置

# 创建目录
mkdir /data/team

# 设置传统权限(所有者完全控制)
chmod 750 /data/team

# 为组设置读写执行ACL
setfacl -m g:team:rwx /data/team

# 设置默认ACL(新文件自动继承)
setfacl -m d:g:team:rwx /data/team

# 验证设置
getfacl /data/team

4.2 Web目录组权限

# Web服务器目录,www-data组有读写执行权限
setfacl -R -m g:www-data:rwx /var/www/html
setfacl -R -m d:g:www-data:rwx /var/www/html

# 同时为用户设置
setfacl -R -m u:webuser:rwx,d:u:webuser:rwx /var/www/html

4.3 共享文件夹(多个组)

# 项目目录
mkdir /data/projectx

# 设置不同组的权限
setfacl -m g:developers:rwx,g:designers:rx,g:testers:r /data/projectx

# 设置默认ACL
setfacl -m d:g:developers:rwx,d:g:designers:rx,d:g:testers:r /data/projectx

5. 管理ACL权限

5.1 修改ACL权限

# 修改已有ACL条目
setfacl -m g:developers:rx /data/project

5.2 删除ACL权限

# 移除用户user1 的非默认权限
sudo setfacl -x u:user1 /data/project

# 移除用户user1 的默认ACL权限
sudo setfacl -x d:u:user1 /data/project

# 删除组的ACL条目
sudo setfacl -x g:developers /data/project

# 删除特定默认ACL
sudo setfacl -x d:g:developers /data/project

# 删除所有ACL权限
sudo setfacl -b /data/project

# 删除所有默认ACL
sudo setfacl -k /data/project
#或使用更具体的方式
sudo setfacl --remove-default /data/project

5.3 备份和恢复ACL

# 备份ACL到文件
getfacl -R /data/project > project_acls.txt

# 恢复ACL
setfacl --restore=project_acls.txt

6. ACL掩码(mask)管理

ACL中的mask限制了最大有效权限:

# 查看mask
getfacl /data/project | grep mask

# 设置mask
setfacl -m m:rwx /data/project
setfacl -m mask::rw /data/project

7. 实用脚本示例

7.1 设置共享目录脚本

#!/bin/bash
# 设置组ACL权限脚本
set_shared_folder() {
local folder="$1"
local group="$2"
local perms="${3:-rwx}"

if [ ! -d "$folder" ]; then
echo"错误: 目录不存在"
return 1
fi

if ! grep -q "^$group:" /etc/group; then
echo"错误: 组 $group 不存在"
return 1
fi

# 设置ACL
    setfacl -m g:"$group":"$perms""$folder"
    setfacl -m d:g:"$group":"$perms""$folder"

echo"已为组 $group 设置 $folder 的 ACL 权限: $perms"
    getfacl "$folder" | head -10
}

使用:

source acl_helper.sh
set_shared_folder "/data/project""developers""rwx"

7.2 批量设置目录ACL

#!/bin/bash
# 批量设置ACL
fordirin /data/{project1,project2,project3}; do
if [ -d "$dir" ]; then
        setfacl -R -m g:developers:rwx,d:g:developers:rwx "$dir"
echo"已设置 $dir 的ACL"
fi
done

8. 重要注意事项

8.1 权限优先级

  1. 1. 所有者权限
  2. 2. 命名用户ACL
  3. 3. 命名组ACL
  4. 4. 其他用户权限

8.2 文件系统支持

确保文件系统支持ACL:

# 检查文件系统是否支持ACL
tune2fs -l /dev/sda1 | grep acl

# 挂载时启用ACL(如果未默认启用)
mount -o remount,acl /data

8.3 ACL vs 传统权限

  • • 传统权限:简单,只能设置一个组
  • • ACL:复杂,可设置多个用户/组,更灵活

8.4 递归设置警告

递归设置ACL会影响大量文件,建议先在小范围测试:

# 先在一个子目录测试
mkdir /data/project/test
setfacl -m g:developers:rwx /data/project/test
ls -ld /data/project/test

9. 最佳实践

  1. 1. 先用传统权限:满足需求时优先使用 chmod
  2. 2. 必要时用ACL:需要多个组或用户时使用
  3. 3. 结合使用:
    # 基础权限
    chmod 750 /data/project
    # 额外组权限
    setfacl -m g:developers:rwx /data/project
  4. 4. 文档记录:记录ACL设置
  5. 5. 定期审计:
    # 查找有ACL的文件
    find /data -type d -exec getfacl {} \; 2>/dev/null | grep "^# file"

通过 setfacl,可以更精细地控制文件系统权限,特别适合需要多个组协同工作的环境。

最新文章

随机文章