Linux 文件权限与 ACL 深入实践

1次阅读

chmod改不了执行权限主因是文件系统挂载时启用了noexec选项,如/tmp等路径;acl失效则常因mask掩码为—或文件系统不支持acl。

Linux 文件权限与 ACL 深入实践

为什么 chmod 改不了某个文件的执行权限?

不是权限没生效,而是文件系统挂载时禁用了执行位(noexec)。常见于 /tmp/var/tmp 或某些容器挂载卷。用 mount | grep $(df . | tail -1 | awk '{print $1}') 查看当前挂载选项,如果含 noexecchmod +x 会成功但实际无法执行。

  • 即使 ls -l 显示 -rwxr-xr-x,运行仍报 Permission denied
  • strace ./a.out 会看到 execve() = -1 EACCES,而非 ENOENTENODEV
  • 临时绕过:用 sh script.sh 代替 ./script.sh;长期方案是重新挂载(需 root)或换路径

setfacl -m 添加用户权限后依然 Permission denied

ACL 生效有前提:文件系统必须支持且已启用 POSIX ACL(如 ext4 默认开启,但某些 NFS 服务端未配 noacl 选项),且目标用户不能被 mask 掩盖。

  • 先确认:运行 getfacl /path/to/file | grep mask,若 mask 是 mask::---,那所有 ACL 条目实际无效
  • 修复 mask:用 setfacl -n -m m::rx /path/to/file-n 表示不重算 mask,强制设为 rx
  • 注意:ACL 对 root 用户无效——root 始终绕过 ACL 检查,所以测试务必用普通用户切过去验证

目录默认 ACL(default:u:user:rwx)为什么子文件没继承

默认 ACL 只影响新创建的文件/子目录,不影响已有内容;而且它只控制“创建时的初始权限”,后续仍受 umask 修正。

  • 新建文件默认无执行位:即使 default ACL 设了 rwx,umask 022 也会砍掉组和其他人的写+执行,结果变成 rw-r--r--
  • 子目录会继承 default ACL,但子文件不会自动获得 default ACL——它只从父目录 default ACL + 当前 umask 计算出初始权限,再丢弃执行位
  • 要让脚本类文件自动可执行,得配合 touch 后手动 chmod +x,或改用 install -m 755 创建

getfacl 输出里出现 # file: .# owner: root 是什么?

这是 ACL 元信息行,非注释,由 getfacl 自动添加用于还原权限。它们本身不参与权限计算,但复制粘贴 ACL 时若漏掉这些行,setfacl --set-file= 会失败。

  • 完整备份 ACL:用 getfacl -R /dir > acl.bak,恢复时用 setfacl --restore=acl.bak
  • 直接用 --set-file 时,文件头三行(# file:, # owner:, # group:)必须存在且准确,否则报 Invalid argument
  • 别手写 ACL 文件——哪怕只差一个空格或换行,setfacl 就静默失败,不提示具体哪错

ACL 的 mask 机制和 umask 的叠加关系最容易被忽略;调权限时盯着 getfacl 输出里的 mask:: 和实际生效的 user::/group:: 对比,比反复试 chmod 更快定位问题。

text=ZqhQzanResources