Linux 文件权限详解
每个 Linux 系统都使用文件权限来控制谁可以读取、写入或执行文件。权限设置错误会导致合法用户被锁定在外,或者敏感文件暴露在外。本指南将解释 Linux 文件所有权和权限的工作原理、如何读取权限字符串,以及如何使用 chmod 和 chown 更改权限。
核心要点
- 每个文件都有一个所有者、一个组,以及针对三个类别的权限集:所有者、组和其他用户。
- 权限三元组使用
r(读取)、w(写入)和x(执行)——它们在文件和目录上的行为有所不同。 - 使用
chmod更改权限(符号或八进制模式),使用chown更改所有权。 umask值控制新创建文件和目录的默认权限。- 特殊位(setuid、setgid、sticky)和 POSIX ACL 可以处理标准模型无法处理的情况。
Linux 文件所有权和权限的结构
Linux 上的每个文件和目录都被分配了:
- 一个所有者(用户账户)
- 一个组(一组用户)
- 针对三个类别的权限集:所有者、组和其他用户
当进程尝试访问文件时,内核按顺序检查这些类别——首先是所有者,然后是组,最后是其他用户——并在第一个匹配项处停止。这些类别是互斥的:如果你是所有者,则只应用所有者位,即使组位的权限更宽松。
如何读取 Linux 中的 rwx 权限
运行 ls -l 查看权限:
$ ls -l
-rw-r--r-- 1 alice developers 4017 Jun 1 10:00 config.conf
drwxr-x--- 2 alice developers 68 Jun 1 10:00 project/
第一个字符是文件类型(- 表示普通文件,d 表示目录,l 表示符号链接)。接下来的九个字符是三个权限三元组:
rw- r-- r--
↑ ↑ ↑
所有者 组 其他用户
每个三元组使用三个位:r(读取)、w(写入)、x(执行)。- 表示该权限未设置。
注意: 如果在权限字符串末尾看到
+(例如-rw-r--r--+),则该文件应用了 POSIX ACL。标准的ls -l不会显示这些额外规则——使用getfacl来检查它们。
每个权限位的实际作用
在文件上:
| 位 | 作用 |
|---|---|
r | 读取文件内容(cat、cp) |
w | 修改或覆盖文件 |
x | 将文件作为程序或脚本执行 |
在目录上:
| 位 | 作用 |
|---|---|
r | 列出目录条目(文件名) |
w | 在目录内创建、重命名或删除文件 |
x | 遍历目录(cd、通过路径打开文件) |
目录上的执行位经常被误解。没有它,你无法 cd 进入目录或通过路径访问其中的任何文件——即使你有读取权限。
如何使用 chmod 更改 Linux 文件权限
chmod 接受符号和数字(八进制)两种模式。
符号模式:
chmod u+x script.sh # 为所有者添加执行权限
chmod go-w config.conf # 从组和其他用户移除写入权限
chmod u=rwx,g=rx,o= app/ # 为所有类别设置精确权限
chmod -R u=rwX,g=rX,o=rX /var/www/html # 递归:大写 X 在目录和已有执行权限的文件上设置执行权限
数字(八进制)模式 — 每位数字是 r=4、w=2、x=1 的和:
chmod 644 config.conf # 所有者 rw,组 r,其他用户 r
chmod 750 script.sh # 所有者 rwx,组 rx,其他用户无权限
chmod 700 ~/.ssh # 仅所有者 — SSH 目录的正确设置
Discover how at OpenReplay.com.
如何使用 chown 更改文件所有权
chown 可以更改所有者、组或两者:
chown alice config.conf # 仅更改所有者
chown alice:developers config.conf # 更改所有者和组
chown -R www-data:www-data /var/www # 递归更改所有权
如何使用 umask 设置默认权限
新文件不会以开放权限开始。umask 值从系统默认值(通常文件为 666,目录为 777)中屏蔽掉某些位。umask 为 022 会产生 644 的文件和 755 的目录——这是 Linux 服务器上最常见的默认设置。
如果父目录配置了默认 ACL,则会继承这些 ACL 规则,而不是纯粹依赖 umask。
umask # 查看当前 umask
umask 027 # 设置更严格的默认值:文件 640,目录 750
特殊权限位:setuid、setgid 和粘滞位
这些扩展了标准模型以应对特定用例:
- setuid (4xxx): 可执行文件以文件所有者的权限运行。用于像
/usr/bin/passwd这样的系统二进制文件。在自定义脚本上使用很危险——应避免使用。 - setgid (2xxx) 在目录上: 新文件继承目录的组而不是创建者的主组。对共享项目目录很有用。
- 粘滞位 (1xxx) 在目录上: 只有文件所有者、目录所有者或 root 可以删除其中的文件。
/tmp上的标准设置。
chmod 2775 /shared/project # 在共享目录上设置 setgid
chmod 1777 /tmp # 粘滞位 — 默认已设置
超越经典权限:ACL 和安全模块
标准的 rwx 权限涵盖了大多数用例,但它们有局限性。如果需要在不更改组成员资格的情况下授予特定用户访问权限,可以通过 setfacl 和 getfacl 使用 POSIX ACL。在运行 SELinux 或 AppArmor 的系统上,安全模块策略会叠加在标准权限之上——文件在 UNIX 层可能是全局可读的,但仍可能被 SELinux 策略阻止。
快速参考:常见权限模式
| 模式 | 符号表示 | 典型用途 |
|---|---|---|
644 | rw-r--r-- | Web 服务器配置文件、公共内容 |
755 | rwxr-xr-x | 目录、可执行脚本 |
700 | rwx------ | 主目录、SSH 密钥目录 |
600 | rw------- | 私钥文件(~/.ssh/id_rsa) |
2775 | rwxrwsr-x | 共享组目录 |
1777 | rwxrwxrwt | 像 /tmp 这样的全局可写目录 |
总结
Linux 文件权限遵循一致、可预测的模型。一旦理解了所有者/组/其他用户结构、rwx 位,以及 chmod 和 chown 如何应用它们,你就掌握了正确保护任何文件或目录的基础。对于三类模型不够精细的情况,可以使用 ACL——并始终牢记最小权限原则。
常见问题
设置 777 会向系统上的每个用户授予读取、写入和执行权限。虽然它消除了所有访问障碍,但也意味着任何用户或受损进程都可以修改或删除该文件。始终为文件分配其正常运行所需的最小权限。
chmod 更改文件上允许的操作(读取、写入、执行)。chown 更改文件的所有者以及它所属的组。通常先使用 chown 分配正确的所有者和组,然后使用 chmod 为每个类别设置适当的权限位。
列出需要读取(r)位,但进入目录需要执行(x)位。如果目录有 r 但没有 x,你可以用 ls 看到文件名,但无法 cd 进入它或通过路径打开其中的任何文件。使用 chmod 添加执行位来解决此问题。
使用 chmod 时用大写 X 而不是小写 x。大写 X 标志仅在目录和已经至少设置了一个执行位的文件上设置执行权限。例如,chmod -R u=rwX,g=rX,o=rX /path 会对目录应用执行权限,同时保持普通文件不可执行。
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.