网站突然 403、脚本提示 permission denied、上传的文件别人看不到——这类问题十有八九是文件权限没设置对。Linux 的权限体系(读、写、执行 + 属主、属组、其他人)是新手最常踩坑的地方,也是面试必考题。这篇文章把权限模型、chmod、chown 和 umask 一次讲明白。
一、权限长什么样
用 ls -l 看任意文件:
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2673 Sep 18 10:00 /etc/passwd
开头的 -rw-r--r-- 就是权限位,拆开看:
- rw- r-- r--
类型 属主 属组 其他
- 第一个字符:
-普通文件、d目录、l软链接、b/c设备; - 每三位一组,顺序固定为 r(读)w(写)x(执行),
-表示没有该权限; - 三组分别对应:属主(user)、属组(group)、其他人(other)。
目录的 x 权限含义特殊:没有 x 就进不了目录,只有 r 也只能看文件名不能进。
二、chmod:修改权限
方式一:数字法(最常用)
r=4、w=2、x=1,把三组权限分别相加:
chmod 755 script.sh # 属主rwx、属组rx、其他rx —— 最常见的可执行文件权限
chmod 644 index.html # 属主rw、属组r、其他r —— 最常见的普通文件权限
chmod 600 id_rsa # 属主rw —— 私钥文件必须这么设,否则 SSH 拒绝使用
chmod 777 file # 所有人可读可写可执行(危险,慎用)
chmod -R 755 /var/www 可递归修改目录下所有文件。
方式二:符号法(增删单权限)
chmod +x script.sh # 给所有人加执行权限
chmod u+x script.sh # 只给属主加执行权限
chmod g-w file # 去掉属组的写权限
chmod a+r file # 所有人加读权限(a=all)
chmod o= file # 清空其他人的所有权限
三、chown:修改属主和属组
chown www:www index.php # 同时改属主和属组
chown www index.php # 只改属主
chown :www index.php # 只改属组
chown -R www:www /var/www/ # 递归修改整个目录
建站场景最常见的操作:把网站目录属主改成 PHP 运行用户(如 www),否则程序无法写入上传目录、无法生成缓存。
四、umask:默认权限的源头
新建文件的默认权限不是 666,目录默认不是 777,而是减去 umask:
umask # 查看当前值,通常是 0022
umask 0027 # 临时修改
- 默认
umask 022→ 新建文件666-022=644,新建目录777-022=755; - 想更安全,把 umask 设为
027(同组不可写、其他不可读); - 永久修改写入
~/.bashrc或/etc/profile。
五、实战场景
1. SSH 密钥权限报错
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
Permissions 0644 for 'id_rsa' are too open 就是因为私钥权限过宽,收紧即可。
2. 网站目录权限标准配置(LNMP/宝塔)
chown -R www:www /www/wwwroot/example.com
find /www/wwwroot/example.com -type d -exec chmod 755 {} \;
find /www/wwwroot/example.com -type f -exec chmod 644 {} \;
chmod 755 /www/wwwroot/example.com/uploads # 需要可写的目录单独放开
3. 脚本无法执行
chmod +x deploy.sh && ./deploy.sh
4. 别人访问不了你的文件
检查属组和其他人的 r 权限:chmod o+r file,或确认目录有 x 权限可进入。
六、特殊权限与扩展位
- setuid(s,数字 4):
chmod 4755,程序以属主身份运行(如/usr/bin/passwd); - setgid(s,数字 2):
chmod 2755,目录内新建文件继承属组,多用户协作常用; - sticky(t,数字 1):
chmod 1777,只有文件属主能删自己的文件(/tmp就是 1777)。
查看:ls -l 里对应位显示 s/S/t/T(大写表示没有对应执行权限)。
七、常见坑
- 权限数字算错:
chmod 777很危险,能上网的程序目录别用;静态资源用 644、脚本用 755 就够; - 改了不生效:PHP-FPM 可能有 opcache,
systemctl reload php-fpm或清缓存;Nginx 用户和文件属主不一致时,看 error.log 的 Permission denied; - 目录 x 权限缺失:只有 rw 没有 x,能看文件列表但打不开文件、进不去目录;
- chown 打错盘:
chown -R前先确认路径,误改系统目录(如 /usr)可能导致系统异常; - Windows 上传的文件没执行权限:在 Windows 上编辑后上传的脚本默认 644,记得
chmod +x。
总结:Linux 权限就记三句话——权限分"读 4 写 2 执行 1"三档,按"属主/属组/其他"三组设置;文件 644、目录 755、密钥 600 是默认起手式;网站项目用 chown -R 运行用户 + 目录 755/文件 644 收尾。配合 umask 控制新文件默认权限,权限问题基本都能自己解决。




