SSH 报 "Permissions 0644 too open"、网站 403——Linux 权限 755/644 一文讲透

· 约 3 分钟 🔓 chmod 计算器

部署时三个最常见的”权限翻车”长得不一样,根子却是同一个:SSH 提示 Permissions 0644 for id_rsa are too open 拒绝登录、网站上传后整站 403 Forbidden、脚本一跑就 Permission denied。它们都源于 Linux 文件权限没配对。这篇从 rwx 和数字的换算讲起,把这几类问题一次说清。

rwx 与数字:权限是怎么算的

Linux 每个文件的权限分给三类主体——属主(owner)、属组(group)、其他人(other),每类各有读 r、写 w、执行 x 三种权限。数字表示法给每种权限赋值再相加:

权限
读 r4
写 w2
执行 x1

三种相加得到一位(0–7),三类拼成三位数:

八进制符号含义
7rwx读 + 写 + 执行
6rw-读 + 写
5r-x读 + 执行
4r—只读
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

权限串里偶尔出现 st,是三个特殊位占用了执行位的显示:

  • 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 命令一并生成,把权限配对这件小事彻底做对。

❓ 常见问题

755、644 这些数字到底是怎么算出来的?

每一位权限是"读 4 + 写 2 + 执行 1"相加,按 所有者 / 所属组 / 其他人 三组各算一位。7=4+2+1(rwx 全有),6=4+2(rw-),5=4+1(r-x),4=4(r--)。所以 755 = rwxr-xr-x(属主全权,组和其他人可读可执行不可写),644 = rw-r--r--(属主可读写,其余只读)。把三组数字拼起来就是最终权限。

为什么 SSH 私钥必须改成 600,不然就不让登录?

OpenSSH 出于安全会拒绝使用"别人也能读"的私钥——一旦私钥被同机其他用户读走就等于身份泄露。600 = rw-------,表示只有属主能读写、组和其他人完全无权限,这是私钥的标准权限。如果是 644 或 664(其他人能读),ssh 会报 "Permissions 0644 for id_rsa are too open" 并拒绝。修复:chmod 600 ~/.ssh/id_rsa,同时 ~/.ssh 目录设 700。

同样是 644,为什么文件正常、目录却打不开报 403?

因为目录的"执行位 x"含义不同:对文件,x 是"可执行";对目录,x 是"可进入/可遍历"。目录少了 x,即使有 r 也无法 cd 进去或访问里面的文件,Web 服务器就会 403 或 500。所以目录要 755(rwxr-xr-x,带 x 可进入),文件用 644(rw-r--r--,无需 x)。常见修复:目录 find . -type d -exec chmod 755 {} +、文件 find . -type f -exec chmod 644 {} +,别一刀切。

权限里出现的 s、t(如 rwsr-xr-x、drwxrwxrwt)是什么意思?

它们是特殊位占用执行位的显示。s 在属主执行位是 setuid(程序以文件属主身份运行,如 /usr/bin/passwd),在属组执行位是 setgid;t 在其他人执行位是 sticky(粘滞位,常见于 /tmp,让用户只能删自己的文件)。小写 s/t 表示该位同时有执行权,大写 S/T 表示设了特殊位但没有执行权(通常是配置失误)。八进制里它们是最前面多出的一位:setuid=4000、setgid=2000、sticky=1000。

图省事直接 chmod 777 行不行?

强烈不建议。777 = rwxrwxrwx,任何用户都能读、写、执行该文件或目录——等于完全不设防,别人能篡改甚至替换你的脚本、读走配置里的密钥,是最常见的安全事故源。绝大多数情况 644(文件)/ 755(目录)就够;需要团队协作写入时用 664/775 并配合属组(chown/chgrp),而不是无脑 777。看到教程让你 777 多半是它在掩盖真正的属主/属组问题。

🔓 打开 chmod 计算器 Unix 权限 755↔rwxr-xr-x 互转 · 复选框可视化 · setuid/setgid/sticky · 符号修改式