速查表
先给结论,日常够用了:
| 数字 | 权限 | 典型用途 |
|---|---|---|
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 权限计算器 对照一下比手算可靠。