定时任务(root)与 Web(www)权限冲突问题——使用 ACL 彻底解决 在 Linux 服务器中权限冲突问是一个非常常见的问题。例如Cron 定时任务root 用户执行PHPNginx PHP-FPMwww-data 或 www 用户执行Apacheapache 用户执行Tomcattomcat 用户执行两个不同用户需要共同读写同一目录。很多人第一反应就是chmod -R 777 data/虽然能解决问题但非常不安全。Linux 提供了更好的方案——ACLAccess Control List。一、为什么传统权限解决不了Linux 普通权限只有三类Owner所有者 Group所属组 Others其他人例如-rw-r--r--表示Owner rw- Group r-- Other r--假设root 定时任务 www PHP目录/data/report/权限drwxr-x--- root root那么root 可以读 写 删除 创建而 www没有权限如果改成775那么要求www 必须属于 root 组现实中通常不是。如果改成777任何用户都能写。安全性很差。二、ACL 是什么ACLAccess Control List就是给某一个指定用户单独赋予权限。例如目录属于 root 但是允许 www 写无需修改 owner 修改 group 修改 777ACL 就像普通权限 Owner Group Other ACL Owner Group Other www mysql backup ...因此更加灵活。三、查看系统是否支持 ACLUbuntuwhich setfacl which getfacl如果没有Ubuntusudo apt install aclCentOSyum install acl查看文件系统mount例如/dev/sda1 on / type ext4现在Linux 大多数ext4 xfs btrfs默认都支持 ACL。四、ACL 常用命令查看 ACLgetfacl 文件例如getfacl report输出# file: report # owner: root # group: root user::rwx user:www:rwx group::r-x mask::rwx other::---说明www 拥有 rwx设置 ACL给 www 权限setfacl -m u:www:rwx report解释-m modify u user www 用户名 rwx 权限再查看getfacl report会看到user:www:rwx说明成功。五、解决 root 与 www 冲突假设/var/www/project/storageroot 定时写cron shellPHPwww需要共同写。设置sudo setfacl -R -m u:www:rwx /var/www/project/storage以后root www 都可以写无需777六、递归设置整个目录setfacl -R -m u:www:rwx data查看getfacl data如果目录很多全部都会拥有 ACL七、新建文件为什么又没权限很多人做到这里发现已有文件可以。但是root 新建文件 www 又打不开。为什么因为ACL 默认不会继承。例如data/里面旧文件 有 ACL后来 roottouch test.txt结果test.txt 没有 ACL这也是很多人踩坑的地方。八、默认 ACLDefault ACLLinux 可以设置以后新建文件 自动继承 ACL命令setfacl -R -d -m u:www:rwx data这里-d default查看getfacl data会看到default:user:www:rwx以后mkdir touch cp都会自动继承。例如roottouch data/a.txt查看getfacl data/a.txt里面user:www:rwx已经自动存在。九、同时给多个用户例如root www backup都需要。setfacl -m u:www:rwx data再setfacl -m u:backup:r-x data查看user:www:rwx user:backup:r-x互不影响。十、给整个用户组例如groupwwwsetfacl -m g:www:rwx data查看group:www:rwx十一、删除 ACL删除某用户setfacl -x u:www data删除组setfacl -x g:www data删除全部 ACLsetfacl -b data十二、mask 是什么查看 ACLuser::rwx user:www:rwx group::rwx mask::r-x other::---很多人疑惑www 是 rwx 为什么不能写因为mask 限制了 ACL 最大权限。真正权限user:www:rwx AND mask:r-x r-x所以没有写权限。修改setfacl -m m:rwx data或者setfacl -m mask:rwx data十三、实际生产环境案例假设目录/var/www/project/storage需求rootcron可以读写wwwPHP可以读写其他用户不能访问新建文件自动继承权限推荐方案# 给 www 设置 ACL sudo setfacl -R -m u:www:rwx /var/www/project/storage # 设置默认 ACL确保新文件继承 sudo setfacl -R -d -m u:www:rwx /var/www/project/storage # 如有需要调整 ACL mask sudo setfacl -R -m m:rwx /var/www/project/storage sudo setfacl -R -d -m m:rwx /var/www/project/storage然后验证getfacl /var/www/project/storage应看到类似输出user::rwx user:www:rwx group::r-x mask::rwx other::--- default:user::rwx default:user:www:rwx default:group::r-x default:mask::rwx default:other::---这样root 的 Cron 任务和 **Web 服务www 用户**即可安全地共享该目录而无需将权限放宽到777。十四、ACL 与 chmod/chown 对比方案灵活性安全性是否推荐chmod 777很低❌ 极低不推荐chown www:www一般中等仅适用于 Web 独占目录chgrp775较高较高同组协作时推荐ACL (setfacl)最高高⭐ 多用户协作场景首选