Linux 文件权限详解:chmod、chown 与 umask 实战


网站突然 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(大写表示没有对应执行权限)。

七、常见坑

  1. 权限数字算错:chmod 777 很危险,能上网的程序目录别用;静态资源用 644、脚本用 755 就够;
  2. 改了不生效:PHP-FPM 可能有 opcache,systemctl reload php-fpm 或清缓存;Nginx 用户和文件属主不一致时,看 error.log 的 Permission denied;
  3. 目录 x 权限缺失:只有 rw 没有 x,能看文件列表但打不开文件、进不去目录;
  4. chown 打错盘:chown -R 前先确认路径,误改系统目录(如 /usr)可能导致系统异常;
  5. Windows 上传的文件没执行权限:在 Windows 上编辑后上传的脚本默认 644,记得 chmod +x。

总结:Linux 权限就记三句话——权限分"读 4 写 2 执行 1"三档,按"属主/属组/其他"三组设置;文件 644、目录 755、密钥 600 是默认起手式;网站项目用 chown -R 运行用户 + 目录 755/文件 644 收尾。配合 umask 控制新文件默认权限,权限问题基本都能自己解决。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

wget 命令详解与实战:文件下载、断点续传与整站镜像

宝塔面板安装与使用教程:从零搭建网站、SSL证书与定时备份

评 论
更换验证码