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

为什么 chmod 改不了某个文件的执行权限?
不是权限没生效,而是文件系统挂载时禁用了执行位(noexec)。常见于 /tmp、/var/tmp 或某些容器挂载卷。用 mount | grep $(df . | tail -1 | awk '{print $1}') 查看当前挂载选项,如果含 noexec,chmod +x 会成功但实际无法执行。
- 即使
ls -l显示-rwxr-xr-x,运行仍报Permission denied -
strace ./a.out会看到execve() = -1 EACCES,而非ENOENT或ENODEV - 临时绕过:用
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,umask022也会砍掉组和其他人的写+执行,结果变成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 更快定位问题。










