速查表

先给结论,日常够用了:

数字 权限 典型用途
644 rw-r--r-- 普通文件、网页文件
600 rw------- 私钥、凭据、.env
755 rwxr-xr-x 目录、可执行脚本
700 rwx------ 家目录、私有目录
640 rw-r----- 配置:属主可写,同组可读
777 rwxrwxrwx 不要用,见下文

三位数字分别是谁

chmod 755 file 里的三位,依次对应:

  7        5        5
  ↓        ↓        ↓
属主    属组     其他人
(u)     (g)      (o)
  • 属主 (user):文件的所有者
  • 属组 (group):文件所属的用户组
  • 其他人 (others):以上都不是的人

每一位怎么算

每一位是三个权限的

权限 数值 对文件 对目录
读 r 4 能查看内容 能列出目录里的文件
写 w 2 能修改内容 能在目录里增删文件
执行 x 1 能运行 能进入这个目录

所以:

  • 7 = 4 + 2 + 1 → 读写执行全有
  • 5 = 4 + 1 → 读 + 执行,不能写
  • 6 = 4 + 2 → 读写,不能执行
  • 4 → 只有读

为什么 755 和 644 是最常见的组合

它们对应「目录」和「文件」两类默认需求:

  • 目录用 755:所有人能进、能看,但只有属主能改
  • 文件用 644:所有人能看,但只有属主能改

这个组合满足绝大多数场景,也是 Web 服务器的默认推荐。一条命令批量设置:

bashfind /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

为什么 777 危险

777 意味着这台机器上的任何用户都能读、写、执行这个文件

危险在哪:

  • 同机器上任何一个被攻破的服务(哪怕是别人的低权限账户),都能改写你的网页文件,塞进去一段恶意脚本
  • 共享主机环境下尤其严重,你的目录别人可以直接写
  • 出了安全事件根本没法排查是谁改的

遇到权限错误就 chmod 777 是个坏习惯。 正确做法是看错误提示,判断缺的是哪一类权限,然后只补那一类。比如 Web 服务写不了上传目录,那需要的是让 Web 服务的用户对这个目录有写权限(改属主或加组),而不是让全世界都能写。

常见误区:x 对目录的含义完全不同

这是最容易理解错的一点:

对文件 对目录
r 读取文件内容 列出目录里的文件名
w 修改文件内容 在目录里创建/删除文件
x 执行这个文件 进入这个目录(cd)、访问里面的文件

关键点:对目录来说,没有 x 你就进不去,即使有 r 也不行。

所以会出现这种困惑:目录权限看着是 r--,能列出文件名,但 cd 进去就报 Permission denied——因为缺 x

同一件事反过来也成立:只有 x 没有 r 的目录,你进得去、也能访问里面已知名字的文件,但列不出目录里有什么

特殊权限位

除了三位,还有第四位(前缀)用来表示特殊权限:

前缀 名称 作用
4 setuid (suid) 执行时以文件属主的身份运行
2 setgid (sgid) 执行时以文件属组的身份运行;对目录表示新建文件继承该组
1 sticky bit 目录内文件只有属主能删

4755 就是带 setuid 的 755。1777 是带 sticky 的 777——/tmp 就是这个权限,所有人能写,但只能删自己的文件。

setuid 要慎用:它意味着普通用户可以借这个程序获得属主(往往是 root)的权限,是提权的常见途径。

懒得算的时候

权限和 rwx 之间的换算偶尔会绕,尤其是往 rwxr-xr-x 这种形式倒推数字时。可以用 chmod 权限计算器 直接勾选,它会同时给出数字和符号两种写法。

调整完权限想验证效果,或者怀疑某次改动影响了谁,用 chmod 权限计算器 对照一下比手算可靠。