Permission denied 是 Linux 新手最高频的报错。排查它需要的不是背 chmod 数字,而是一张决策图:进程以谁的身份运行?路径每一级目录能不能进?文件本身让不让读写?本文先把权限模型讲清楚,再用一个共享目录案例把 umask、SGID、ACL 串起来。
权限三元组
ls -l 输出的 -rw-r--r-- 分四段:文件类型 + 属主权限 + 属组权限 + 其他人权限。文件和目录上,同样字母含义不同:
| 权限 | 对文件 | 对目录 |
|---|---|---|
| r | 读内容 | 列出文件名 |
| w | 改内容 | 增删改目录项(需配合 x) |
| x | 作为程序执行 | 进入目录、访问其中已知名字的对象 |
最容易误判的是目录的 x 权限:文件本身可读,但路径上任何一级目录没有 x,照样打不开。用 namei -l /srv/app/data/config.yml 可以把路径逐级权限一次列出来,是排查权限问题的首选命令。
另一个反直觉点:删除文件看的是父目录的 w+x,与文件本身是否可写无关。这就是为什么 /tmp 里自己的文件能被自己删掉,而 sticky bit(t)又阻止你删别人的文件。
数字与归属
r=4, w=2, x=1 按位相加:644 = 属主读写、组内只读、其他人只读;755 = 属主全权、其他人可读可进入。修改归属需要管理员权限:
chmod 640 report.txt # 或 chmod u=rw,g=r,o= report.txtchown alice:project report.txtumask:新文件的默认权限
程序创建文件时会声明一个期望权限(普通文件通常 666,目录 777),umask 负责屏蔽其中部分位:umask 为 022 时,新文件是 644、新目录是 755。注意它是按位掩码,不是算术减法——umask 011 作用于 666 得到的是 666 而非 655(奇数位本来就没有执行位可减)。
umask 命令查看当前值。改 umask 只影响之后创建的文件,已有文件不受影响。
实战:配置团队共享目录
目标:project 组的成员都能在 /srv/project 里协作,新建文件自动继承组归属,组内成员默认可互相修改。
sudo groupadd -f projectsudo usermod -aG project alice # 把成员加入组(重新登录生效)sudo mkdir -p /srv/projectsudo chown root:project /srv/projectsudo chmod 2775 /srv/projectsudo setfacl -d -m g:project:rwx /srv/project逐条解释:
2775中的 2 是 SGID 位:目录带 SGID 后,其中新建的文件和子目录自动继承project组,而不是创建者的私人主组——这是共享目录的关键。- 默认 ACL(
-d):仅靠 SGID 只解决「组归属」,不解决「组内可写」——如果成员的 umask 是 022,新文件的组权限仍没有 w。默认 ACL 强制组内新建对象带 rwx,绕开各成员 umask 不一致的问题。 - 成员加组后需要重新登录,已有终端会话里的组列表不会自动刷新。
验证:两名成员各自 touch 一个文件,互相 getfacl 确认 effective 权限含 w,再交叉修改一次。
权限排查决策表
| 症状 | 先查 | 常见根因 |
|---|---|---|
| 文件明明存在却说找不到 | namei -l | 某级父目录缺 x |
| 能读不能改 | ls -l、getfacl | 缺 w,或 ACL mask 收窄 |
| 能改不能删 | 父目录权限 | 父目录缺 w+x,或有 sticky bit |
| 加组后还是 denied | 重开终端后 id | 会话未刷新 |
| 权限全对仍拒绝 | getenforce、dmesg | SELinux/AppArmor 策略 |
sudo 的最小授权原则
能用到组权限解决的共享问题,就不要发 sudo。确实需要授权时,用 visudo -f /etc/sudoers.d/team 写只覆盖必要命令的规则,例如只允许重启指定服务:
%project ALL=(root) /usr/bin/systemctl restart myapp允许 sudo vim、sudo bash 或执行用户可写的脚本,等于把整个 root 交出去。
延伸阅读
- GNU Coreutils:File permissions
man 5 acl、man 1 namei、man 5 sudoers
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 44 天
部分内容可能已过时