
为什么文件权限很重要
Linux 系统中的每个文件和目录都有所有者以及一组规则,控制谁能读取、写入或执行它。如果设置错误,你可能会把自己锁在自己的文件之外,或者更糟——让敏感数据被系统上的任何用户读取。
本指南从基本原理出发解释权限系统,让你不再猜测,真正理解 ls -la 输出的含义。

解读权限字符串
在任何目录中运行 ls -la,你会看到类似这样的输出:
-rwxr-xr-- 1 alice devs 4096 May 10 09:30 deploy.sh
drwxr-x--- 2 alice devs 4096 May 8 14:22 config/
第一列是一个 10 字符的字符串。分解如下:
| 位置 | 字符 | 含义 |
|---|---|---|
| 1 | - 或 d | 文件类型:- = 普通文件,d = 目录 |
| 2-4 | rwx | 所有者权限 |
| 5-7 | r-x | 组权限 |
| 8-10 | r-- | 其他人(世界)权限 |
每个三元组使用三个标志:
- r(读,值 4)——查看文件内容或列出目录
- w(写,值 2)——修改文件或在目录中添加/删除文件
- x(执行,值 1)——将文件作为程序运行,或 cd 进入目录
- - ——未授予权限
所以 rwxr-xr-- 表示:所有者可以读/写/执行;组可以读/执行;其他人只能读。
八进制表示法:chmod 背后的数字
每个权限三元组通过将已授予权限的值相加,映射为 0 到 7 的数字:
| 八进制 | 二进制 | 权限 |
|---|---|---|
| 7 | 111 | rwx |
| 6 | 110 | rw- |
| 5 | 101 | r-x |
| 4 | 100 | r-- |
| 3 | 011 | -wx |
| 2 | 010 | -w- |
| 1 | 001 | --x |
| 0 | 000 | --- |
三个八进制数字依次覆盖所有者、组和其他人。所以 chmod 754 file 将所有者设为 rwx (7),组设为 r-x (5),其他人设为 r-- (4)。

最常见的权限模式
chmod 644 —— 标准 Web 文件。所有者可读可写;其他人只读。用于 HTML、CSS、配置文件以及 Web 服务器需要读取但不需要执行的文件。
chmod 755 —— 可执行脚本或公共目录。所有者拥有完全控制权;组和其他人可以读取和执行但不能修改。用于 shell 脚本、二进制文件和公共目录。
chmod 700 —— 私有文件。只有所有者拥有任何访问权限。用于 SSH 密钥、凭证文件和私有脚本。
chmod 600 —— 敏感数据,无需执行。SSH 私钥文件必须为 600,否则 SSH 会拒绝使用。
chmod 777 —— 除非你确切知道原因,否则避免使用。系统上的任何人都可以读、写和执行。在共享或生产服务器上几乎永远不是正确的选择。
符号模式:用字母代替数字
chmod 也接受符号语法,对于有针对性的更改更易读:
chmod u+x script.sh # 为所有者添加执行权限
chmod g-w file.txt # 从组中移除写权限
chmod o=r file.txt # 将其他人权限精确设为只读
chmod a+r file.txt # 为所有人添加读权限(a = all)
chmod ug+rw,o-rwx data/ # 所有者+组读/写,其他人无权限
字母含义:u = 用户(所有者),g = 组,o = 其他人,a = 三者全部。操作符:+ 添加,- 移除,= 精确设置。

目录与文件:关键区别
执行权限在目录上的含义不同。没有目录的 x 权限,即使你有读权限,也无法 cd 进入或访问其中的任何内容。这就是为什么目录需要 755,而其内容可以是 644。
# 错误:破坏目录遍历
chmod -R 644 /var/www/html/
# 正确:X(大写)仅对目录应用执行权限
chmod -R u=rwX,go=rX /var/www/html/
chown:更改所有权
chown alice file.txt # 更改所有者
chown alice:devs file.txt # 更改所有者和组
chown -R www-data /var/www/ # 递归,常见于 Web 服务器
特殊权限位
setuid (4000) —— 可执行文件以文件所有者身份运行,而非调用者。passwd 命令使用此权限。
setgid (2000) —— 目录中的新文件继承目录的组。适用于共享项目文件夹。
粘滞位 (1000) —— 在像 /tmp 这样的目录上,防止用户删除不属于自己的文件。
chmod 4755 /usr/local/bin/mytool # setuid + 755
chmod 2775 /shared/project/ # setgid + 775
chmod 1777 /tmp # 粘滞位 + 完全写权限
Web 服务器权限参考
| 位置 | 所有者 | 权限 |
|---|---|---|
| 应用程序文件 | deploy 用户 | 644 |
| 应用程序目录 | deploy 用户 | 755 |
| Shell 脚本/二进制文件 | deploy 用户 | 755 |
| 上传内容 | www-data | 644 |
| 上传目录 | www-data | 755 |
| .env / 凭证文件 | deploy 用户 | 600 |
| SSH 私钥 | 用户 | 600 |
→ 试试 chmod 计算器,在八进制、符号和可读格式之间即时转换。