Linux 文件权限是每个开发者迟早会被绊倒的地方。脚本加完权限还是跑不起来,Web 服务器读不到静态文件,SSH 私钥权限太宽导致登录被拒——这些问题的根源都是没搞清 chmod 的逻辑。本文从原理到实战,把常用权限值讲清楚。
Unix 权限模型
Linux 的每个文件和目录都有三组权限:
- Owner(所有者) — 文件的创建者或指定用户
- Group(组) — 文件所属用户组的成员
- Others(其他人) — 所有其他用户
每组权限包含三种类型:
| 符号 | 名称 | 对文件 | 对目录 |
|---|---|---|---|
r | 读取 | 查看文件内容 | 列出目录内容(ls) |
w | 写入 | 修改文件内容 | 在目录内创建、重命名、删除文件 |
x | 执行 | 作为程序运行 | 进入目录(cd)并访问其中的文件 |
ls -la
# -rwxr-xr-- 1 alice dev 4096 Apr 5 10:00 deploy.sh
# ^^^ ^^^ ^^^
# | | 其他人: r-- (4)
# | 组: r-x (5)
# 所有者: rwx (7)
八进制记法
每一组权限用二进制权重映射为一个数字:
r = 4 (二进制 100)
w = 2 (二进制 010)
x = 1 (二进制 001)
将三组数字相加,得到对应的八进制权限值:
| 八进制 | 二进制 | 权限 |
|---|---|---|
| 7 | 111 | rwx |
| 6 | 110 | rw- |
| 5 | 101 | r-x |
| 4 | 100 | r— |
| 0 | 000 | --- |
三位八进制数(如 755)依次表示 所有者 / 组 / 其他人 的权限。
常用 chmod 值详解
chmod 755
所有者: rwx (7) — 读、写、执行
组: r-x (5) — 读、执行
其他人: r-x (5) — 读、执行
适用场景: 可执行脚本、程序二进制文件、Web 目录。所有人可以进入目录或运行脚本,但只有所有者能修改内容。
chmod 755 /var/www/html
chmod 755 deploy.sh
chmod 644
所有者: rw- (6) — 读、写
组: r-- (4) — 只读
其他人: r-- (4) — 只读
适用场景: 普通文本文件、HTML 页面、图片、配置文件。所有者可编辑,其他人只能读取。
chmod 644 index.html
chmod 644 /etc/nginx/nginx.conf
chmod 600
所有者: rw- (6) — 读、写
组: --- (0) — 无权限
其他人: --- (0) — 无权限
适用场景: 只有所有者可以访问的私密文件——SSH 私钥(~/.ssh/id_rsa)、.env 环境变量文件、包含密码的配置。SSH 客户端会拒绝使用权限不是 600 的私钥。
chmod 600 ~/.ssh/id_rsa
chmod 600 .env
chmod 777
所有者: rwx (7)
组: rwx (7)
其他人: rwx (7)
危险。 系统上所有人都可以读、写、执行。不要在生产环境使用 777,尤其是 Web 目录内的路径——任何进程都可以向其中写入任意文件。
唯一合理用途:本地开发时快速排查是否是权限导致的问题,定位完毕后立刻恢复。
chmod 775
组成员也获得写权限。适用于多人协作的项目目录,团队成员同属一个用户组:
chown -R :developers /var/www/project
chmod -R 775 /var/www/project
符号记法
八进制记法精确,但需要心算。符号记法更适合增量修改:
# 给所有者加执行权限
chmod u+x script.sh
# 去掉组和其他人的写权限
chmod go-w sensitive.cfg
# 精确设置:rw-r--r--
chmod u=rw,go=r file.txt
# 给所有人加执行权限
chmod a+x script.sh
符号说明:u = 所有者,g = 组,o = 其他人,a = 所有人
操作符:+ = 添加,- = 去除,= = 精确设置
递归修改权限
对目录及其所有内容批量修改:
chmod -R 755 /var/www/html
注意: -R 会对文件和目录应用同一个权限值。目录需要 x 才能被进入,普通文件通常不需要执行权限。用 find 分别处理更稳妥:
# 目录: 755
find /var/www/html -type d -exec chmod 755 {} \;
# 文件: 644
find /var/www/html -type f -exec chmod 644 {} \;
特殊权限位
除了标准的九位权限,还有三个特殊标志位:
Setuid(4xxx): 可执行文件设置后,运行时以文件所有者身份执行,而非调用者。sudo、passwd 等系统命令使用此机制。
Setgid(2xxx): 目录设置后,目录内新建文件自动继承该目录的用户组,而非创建者的主组。适合多人协作目录。
Sticky bit(1xxx): 目录设置后,用户只能删除自己创建的文件。/tmp 目录就设置了 sticky bit。
ls -la /
# drwxrwxrwt ... tmp (末尾的 't' 表示 sticky bit)
ls -la /usr/bin/passwd
# -rwsr-xr-x ... passwd (所有者执行位的 's' 表示 setuid)
权限速查表
| 八进制 | 符号记法 | 常见用途 |
|---|---|---|
| 400 | r-------- | 只读保护 |
| 600 | rw------- | 私密文件、SSH 私钥、.env |
| 644 | rw-r—r— | Web 文件、配置、普通文本文件 |
| 700 | rwx------ | 个人脚本、私有目录 |
| 755 | rwxr-xr-x | 脚本、程序、公开目录 |
| 775 | rwxrwxr-x | 团队协作项目目录 |
| 777 | rwxrwxrwx | 生产环境禁用 |
免心算,直接用工具
如果不想每次都手动换算八进制,直接用计算器。试用 ZeroTool chmod 计算器 →
勾选所有者、组、其他人的读/写/执行权限,八进制值实时更新。也可以反向输入八进制值,直接看它代表哪些权限——非常适合看别人的部署脚本时快速确认。
小结
日常工作中 90% 的情况只需要两个值:644 用于文件,755 用于目录和可执行文件。需要私密保护的文件用 600。777 只在本地调试时临时用,生产环境绝对不要出现。
不确定某个八进制值的含义?用 chmod 计算器查一下,比猜更靠谱。