Back

Linux 文件权限详解

Linux 文件权限详解

每个 Linux 系统都使用文件权限来控制谁可以读取、写入或执行文件。权限设置错误会导致合法用户被锁定在外,或者敏感文件暴露在外。本指南将解释 Linux 文件所有权和权限的工作原理、如何读取权限字符串,以及如何使用 chmodchown 更改权限。

核心要点

  • 每个文件都有一个所有者、一个组,以及针对三个类别的权限集:所有者、组和其他用户。
  • 权限三元组使用 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读取文件内容(catcp)
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=4w=2x=1 的和:

chmod 644 config.conf   # 所有者 rw,组 r,其他用户 r
chmod 750 script.sh     # 所有者 rwx,组 rx,其他用户无权限
chmod 700 ~/.ssh        # 仅所有者 — SSH 目录的正确设置

如何使用 chown 更改文件所有权

chown 可以更改所有者、组或两者:

chown alice config.conf              # 仅更改所有者
chown alice:developers config.conf   # 更改所有者和组
chown -R www-data:www-data /var/www  # 递归更改所有权

如何使用 umask 设置默认权限

新文件不会以开放权限开始。umask 值从系统默认值(通常文件为 666,目录为 777)中屏蔽掉某些位。umask022 会产生 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 权限涵盖了大多数用例,但它们有局限性。如果需要在不更改组成员资格的情况下授予特定用户访问权限,可以通过 setfaclgetfacl 使用 POSIX ACL。在运行 SELinux 或 AppArmor 的系统上,安全模块策略会叠加在标准权限之上——文件在 UNIX 层可能是全局可读的,但仍可能被 SELinux 策略阻止。

快速参考:常见权限模式

模式符号表示典型用途
644rw-r--r--Web 服务器配置文件、公共内容
755rwxr-xr-x目录、可执行脚本
700rwx------主目录、SSH 密钥目录
600rw-------私钥文件(~/.ssh/id_rsa)
2775rwxrwsr-x共享组目录
1777rwxrwxrwt/tmp 这样的全局可写目录

总结

Linux 文件权限遵循一致、可预测的模型。一旦理解了所有者/组/其他用户结构、rwx 位,以及 chmodchown 如何应用它们,你就掌握了正确保护任何文件或目录的基础。对于三类模型不够精细的情况,可以使用 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.

OpenReplay