permission-denied

Permission denied 的定位与修复

现象

读取、写入或执行文件时报 Permission denied;服务以非 root 用户运行时无法访问配置、日志或密钥。

快速定位

id
ls -l /path/to/file
namei -l /path/to/file
stat /path/to/file
getfacl /path/to/file
getenforce
ausearch -m avc -ts recent

挂载与能力:

findmnt -T /path/to/file
getcap /path/to/binary

常见根因

  1. 权限位不足,或父目录缺少执行(x)权限。
  2. 文件属主/属组与应用运行用户不一致。
  3. ACL 覆盖了普通权限位。
  4. SELinux/AppArmor 拒绝,ls -l 看起来却正常。
  5. 挂载点带 noexec、nosuid,或容器以只读根文件系统运行。

修复

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. ls -l 看权限位正常,服务仍报 Permission denied,还应检查什么?
  2. 修复权限时为什么不建议直接 chmod 777?
  3. SELinux 拒绝如何定位和修复?
答案
  1. 用 namei -l 逐级检查路径上的目录权限,最容易漏的是父目录缺少 x 权限。还要看 ACL、SELinux/AppArmor 和挂载选项。
  2. 应按最小权限修正属主/属组或调整 chmod,777 会放大权限。也要先用 getfacl 确认是否是 ACL 覆盖了普通权限位。
  3. 用 ausearch -m avc -ts recent 找 AVC 记录。再用 semanage fcontext/restorecon 修正 SELinux 上下文。