跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

Linux 文件权限与 ACL 深入实践

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 修正。 CentOS Linux 7.9.2009 CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。 下载 新建文件默认无执行位:即使 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 更快定位问题。

相关文章