chmod改不了执行权限主因是文件系统挂载时启用了noexec选项,如/tmp等路径;ACL失效则常因mask掩码为---或文件系统不支持ACL。
为什么
改不了某个文件的执行权限?
不是权限没生效,而是文件系统挂载时禁用了执行位(
)。常见于
、
或某些容器挂载卷。用
查看当前挂载选项,如果含
,
会成功但实际无法执行。
即使
显示
,运行仍报
会看到
,而非
或
临时绕过:用
代替
;长期方案是重新挂载(需 root)或换路径
添加用户权限后依然 Permission denied
ACL 生效有前提:文件系统必须支持且已启用 POSIX ACL(如 ext4 默认开启,但某些 NFS 服务端未配
选项),且目标用户不能被 mask 掩盖。
先确认:运行
,若 mask 是
,那所有 ACL 条目实际无效
修复 mask:用
(
表示不重算 mask,强制设为
)
注意:ACL 对 root 用户无效——root 始终绕过 ACL 检查,所以测试务必用普通用户切过去验证
目录默认 ACL(
)为什么子文件没继承?
默认 ACL 只影响新创建的文件/子目录,不影响已有内容;而且它只控制“创建时的初始权限”,后续仍受 umask 修正。
CentOS Linux 7.9.2009
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
下载
新建文件默认无执行位:即使 default ACL 设了
,umask
也会砍掉组和其他人的写+执行,结果变成
子目录会继承 default ACL,但子文件不会自动获得 default ACL——它只从父目录 default ACL + 当前 umask 计算出初始权限,再丢弃执行位
要让脚本类文件自动可执行,得配合
后手动
,或改用
创建
输出里出现
和
是什么?
这是 ACL 元信息行,非注释,由
自动添加用于还原权限。它们本身不参与权限计算,但复制粘贴 ACL 时若漏掉这些行,
会失败。
完整备份 ACL:用
,恢复时用
直接用
时,文件头三行(
,
,
)必须存在且准确,否则报
别手写 ACL 文件——哪怕只差一个空格或换行,
就静默失败,不提示具体哪错
ACL 的 mask 机制和 umask 的叠加关系最容易被忽略;调权限时盯着
输出里的
和实际生效的
/
对比,比反复试 chmod 更快定位问题。
chmodnoexec/tmp/var/tmpmount | grep $(df . | tail -1 | awk '{print $1}')noexecchmod +xls -l-rwxr-xr-xPermission deniedstrace ./a.outexecve() = -1 EACCESENOENTENODEVsh script.sh./script.shsetfacl -mnoaclgetfacl /path/to/file | grep maskmask::---setfacl -n -m m::rx /path/to/file-nrxdefault:u:user:rwxrwx022rw-r--r--touchchmod +xinstall -m 755getfacl# file: .# owner: rootgetfaclsetfacl --set-file=getfacl -R /dir > acl.baksetfacl --restore=acl.bak--set-file# file:# owner:# group:Invalid argumentsetfaclgetfaclmask::user::group::