正在加载,请稍候…

Linux 文件权限详解:chmod、chown 与八进制表示法

从零理解 Linux 文件权限,掌握 rwx 含义、八进制表示法,以及 chmod 755、644、777 的使用场景。

Linux 文件权限详解:chmod、chown 与八进制表示法

为什么文件权限很重要

Linux 系统中的每个文件和目录都有所有者以及一组规则,控制谁能读取、写入或执行它。如果设置错误,你可能会把自己锁在自己的文件之外,或者更糟——让敏感数据被系统上的任何用户读取。

本指南从基本原理出发解释权限系统,让你不再猜测,真正理解 ls -la 输出的含义。

Linux 文件权限详解:chmod、chown 与八进制表示法 插图

解读权限字符串

在任何目录中运行 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)。

Linux 文件权限详解:chmod、chown 与八进制表示法 插图

最常见的权限模式

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 = 三者全部。操作符:+ 添加,- 移除,= 精确设置。

Linux 文件权限详解:chmod、chown 与八进制表示法 插图

目录与文件:关键区别

执行权限在目录上的含义不同。没有目录的 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 计算器,在八进制、符号和可读格式之间即时转换。