部署时三个最常见的”权限翻车”长得不一样,根子却是同一个:SSH 提示 Permissions 0644 for id_rsa are too open 拒绝登录、网站上传后整站 403 Forbidden、脚本一跑就 Permission denied。它们都源于 Linux 文件权限没配对。这篇从 rwx 和数字的换算讲起,把这几类问题一次说清。
rwx 与数字:权限是怎么算的
Linux 每个文件的权限分给三类主体——属主(owner)、属组(group)、其他人(other),每类各有读 r、写 w、执行 x 三种权限。数字表示法给每种权限赋值再相加:
| 权限 | 值 |
|---|---|
| 读 r | 4 |
| 写 w | 2 |
| 执行 x | 1 |
三种相加得到一位(0–7),三类拼成三位数:
| 八进制 | 符号 | 含义 |
|---|---|---|
| 7 | rwx | 读 + 写 + 执行 |
| 6 | rw- | 读 + 写 |
| 5 | r-x | 读 + 执行 |
| 4 | r— | 只读 |
| 0 | --- | 无权限 |
所以 755 = rwxr-xr-x(属主全权,组和其他人可读可执行不可写),644 = rw-r—r—(属主可读写,其余只读)。记不住时勾选复选框让工具帮你换算最稳。
私钥为什么必须 600
Permissions 0644 ... too open 是 OpenSSH 的安全保护:它拒绝使用”别人也能读”的私钥,因为私钥一旦被同机其他用户读走,你的身份就等于泄露。
私钥的标准权限是 600(rw-------):只有属主能读写,组和其他人完全无权。修复两步:
chmod 600 ~/.ssh/id_rsa # 私钥仅属主可读写
chmod 700 ~/.ssh # .ssh 目录仅属主可进入
同理,含密码、token 的配置文件也应收到 600,别让它停在默认的 644。
网站 403:目录的 x 和文件不一样
同样是缺权限,目录和文件的”执行位 x”含义完全不同,这是 403 最隐蔽的原因:
- 对文件:x = 可执行(脚本、二进制)
- 对目录:x = 可进入/可遍历(cd 进去、访问里面的内容)
目录没有 x,即使有 r 也进不去,Web 服务器访问里面的文件就会 403/500。所以标准配法是目录 755(带 x 可进入)、文件 644(无需 x),而且必须区分类型批量设置:
find . -type d -exec chmod 755 {} + # 所有目录
find . -type f -exec chmod 644 {} + # 所有文件
千万别用 chmod -R 755 把文件也加上执行位,更别一律 777。
特殊位:s 和 t
权限串里偶尔出现 s、t,是三个特殊位占用了执行位的显示:
- setuid(4000):在属主执行位显示
s,程序以文件属主身份运行,典型如/usr/bin/passwd - setgid(2000):在属组执行位显示
s,以属组身份运行;用在目录上则新建文件自动继承该目录的属组 - sticky(1000):在其他人执行位显示
t,常见于/tmp,让用户只能删自己的文件
小写 s/t 表示该位同时有执行权,大写 S/T 表示设了特殊位却没执行权(多半是配置失误)。八进制里它们是最前面多出的第四位,比如 4755 = rwsr-xr-x。
别用 777
chmod 777 看似一劳永逸,实则把文件/目录对任何用户完全开放——别人能改你的脚本、替换可执行文件、读走配置里的密钥,是最常见的安全事故来源。真正需要的几乎都能用更小的权限满足:
- 普通文件 → 644
- 目录、可执行脚本 → 755
- 私钥、敏感配置 → 600
- 团队协作写入 → 775 + 同属组(chgrp + 可选 setgid),而不是 777
看到教程让你 777,多半是它在用”全开放”掩盖真正该解决的属主/属组问题。
小结
SSH 拒登、网站 403、脚本 Permission denied,背后是同一套 rwx 权限模型在不同场景的体现:私钥要 600、目录要 755(靠 x 进入)、文件用 644,协作靠属组而非 777。算不清数字时,用 chmod 计算器勾选复选框,八进制、符号串和 chmod 命令一并生成,把权限配对这件小事彻底做对。