在Linux文件夹或文件需要对某些用户和组授予相关权限,如果你直接使用chmod是没法对权限精细化管理的,这时就需要用到ACL,setfacl 是设置访问控制列表(ACL)的命令,可以更灵活地管理文件和目录权限,支持为多个用户和组设置不同的权限。以下是使用 setfacl 为组设置文件夹权限的详细指南:
# 为组设置权限
setfacl -m g:组名:权限 目录名
# 查看ACL权限
getfacl 目录名
# 递归设置(包括子目录和文件)
setfacl -R -m g:组名:权限 目录名# 为 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# 为现有文件设置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# 递归设置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# 查看ACL
getfacl /data/project
# 示例输出:
# file: /data/project
# owner: user1
# group: user1
# user::rwx
# group::r-x
# group:developers:rwx # ← 这是添加的ACL
# mask::rwx
# other::r--# 创建目录
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# 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# 项目目录
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# 修改已有ACL条目
setfacl -m g:developers:rx /data/project# 移除用户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# 备份ACL到文件
getfacl -R /data/project > project_acls.txt
# 恢复ACL
setfacl --restore=project_acls.txtACL中的mask限制了最大有效权限:
# 查看mask
getfacl /data/project | grep mask
# 设置mask
setfacl -m m:rwx /data/project
setfacl -m mask::rw /data/project#!/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"#!/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确保文件系统支持ACL:
# 检查文件系统是否支持ACL
tune2fs -l /dev/sda1 | grep acl
# 挂载时启用ACL(如果未默认启用)
mount -o remount,acl /data递归设置ACL会影响大量文件,建议先在小范围测试:
# 先在一个子目录测试
mkdir /data/project/test
setfacl -m g:developers:rwx /data/project/test
ls -ld /data/project/testchmod# 基础权限
chmod 750 /data/project
# 额外组权限
setfacl -m g:developers:rwx /data/project# 查找有ACL的文件
find /data -type d -exec getfacl {} \; 2>/dev/null | grep "^# file"通过 setfacl,可以更精细地控制文件系统权限,特别适合需要多个组协同工作的环境。