Permission denied 基本不是玄学:先看 Linux 文件权限本身,再查属主、路径上每一级目录和挂载选项,四步之内九成能定位。下面按「读懂 → 定位 → 修 → 避坑」的顺序走,命令都可以直接复制。
一、读懂 Linux 文件权限:ls -l 那串字符怎么看
在文件所在目录跑 ls -l app.log,会看到类似这样一行:
-rw-r--r-- 1 deploy deploy 2048 Oct 30 10:00 app.log
- 第 1 位是类型:
-普通文件、d目录、l软链接。
- 后面 9 位分三组,每组 3 位,依次是属主 u、属组 g、其他人 o。
- 每组里
r读=4、w写=2、x执行=1,相加得到的数字就是chmod后面用的那个数。
所以 -rw-r--r-- 等于 644:属主能读能写,同组和其他人只能读。
目录的 rwx 是另一套含义
目录的 r 是能不能列出里面有哪些文件,x 是能不能进得去,w 是能不能在里面新建或删除文件。只有 r 没有 x,ls 能看见名字,但 cd 进去和读里面的文件都会被拒。
二、定位:四类报错对应四种权限原因
对照报错找原因,别一上来就 chmod 777。
cat: xxx: Permission denied,读文件被拒:文件对当前用户没有r,或者路径上某一级目录没有x。
cd: xxx: Permission denied:目录缺x,跟里面文件的权限无关。
bash: ./run.sh: Permission denied:脚本缺x,执行chmod u+x run.sh就行,和脚本内容没关系。
- 上传或写文件失败:目标目录对运行服务的用户没有
w,常见于 web 目录属主还是 root。
先确认自己是谁:whoami 看用户名,id 还会列出所属组,属组那三位权限对不对得上,就看这个输出。
三、改 Linux 文件权限:三种做法,代价不一样
- 只给自己加执行:
chmod u+x run.sh。影响面最小,改完ls -l会看到变成-rwxr--r--。
- 按数字一次定死:普通文件用
chmod 644,目录用chmod 755,脚本也用chmod 755。这组值覆盖大多数场景。
- 属主不对就改属主:
sudo chown -R www-data:www-data /var/www/app。这比放开权限安全,多人服务器上尤其该先做这一步。
三个常见坑:
chmod -R 777会把私钥、配置、上传目录一起开放。团队协作优先把属组设成共同组,再给 775。
- 加
-R之前先用ls -l看清目录里有什么,改错目录回滚很费劲。
- 新建文件的默认权限由
umask决定,常见的022对应文件 644、目录 755,改不动权限时先umask看一眼。
四、改完还报错,查这 3 个地方
- 父目录链:
/home/a/b/c里任意一级缺x,后面文件权限给满也没用。用namei -l /path/to/file一次列出每一级的权限。
- 挂载选项:U 盘、数据盘可能以
noexec挂载,脚本加了x也跑不起来,mount | grep 挂载点看有没有这个参数。
- 强制访问控制:CentOS、RHEL 上的 SELinux,Ubuntu 上的 AppArmor,会在普通权限之外再拦一次。
getenforce显示 Enforcing 时,去看sudo tail /var/log/audit/audit.log里的拒绝记录。
常见问题(FAQ)
chmod 777 了还是 Permission denied,为什么?
通常不是文件权限本身的问题,而是父目录缺 x、分区只读或带 noexec 挂载,或者被 SELinux、AppArmor 拦下。用 namei -l 路径 逐级看,再查挂载参数和安全模块日志。
755 和 644 分别代表什么?
755 是属主 rwx、属组 r-x、其他人 r-x,目录和可执行脚本常用;644 是属主 rw-、其他人 r–,文本、配置、网页文件常用。记住目录给 755、普通文件给 644 就不会出大错。
怎么只让自己能改,别人只能看?
文件用 chmod 644、目录用 chmod 755,属主设成自己:chown 你的用户名 文件名。要多人协作就把属组改成共同组,再放宽到 664 和 775。
目录权限里的 x 到底有什么用?
x 是通行证。没有它,即使有 r 也只能看到文件名,进不去、读不了里面的文件、也执行不了里面的程序。所以给目录别只给 r。
遇到权限问题,把 Linux 文件权限当成三层来查——文件本身、路径上每一级目录、挂载与安全模块,按顺序排一遍,比反复试数字快得多。
最后更新:2026-10-30(命令参数与各发行版默认策略可能调整,请以官方文档为准)。