Linux 读写执行权限(-r、-w、-x)的真正含义是什么?

当我们使用 ls -l 命令列出 Linux 系统中的文件时,最左边的一列包含了像 drwxr-xr-x 这样的神秘代码。对于许多初学者甚至一些有经验的用户来说,r(读)、w(写)、x(执行)这三个权限似乎一目了然:读就是看内容,写就是改内容,执行就是运行程序。然而,这种理解虽然直观,但却过于简化,甚至在某些关键场景下是错误的。

Linux 的权限模型根植于其 Unix 哲学,其设计精巧而严谨。rwx 对文件和目录的含义截然不同。误解这些含义可能导致安全漏洞或操作失败。本文将深入探讨这些权限对普通文件目录的真正含义,并涵盖特殊权限、umask 以及最佳实践。

目录#

  1. 权限基础:三组用户
  2. 文件的 rwx 权限详解
    • 2.1 读权限 -r
    • 2.2 写权限 -w
    • 2.3 执行权限 -x
  3. 目录的 rwx 权限详解(关键区别)
    • 3.1 读权限 d-r
    • 3.2 写权限 d-w
    • 3.3 执行权限 d-x(最重要的目录权限)
  4. 权限操作实战
    • 4.1 查看权限:ls -l
    • 4.2 更改权限:chmod 命令(符号法与八进制法)
    • 4.3 设置默认权限:umask
  5. 特殊执行权限:SUID、SGID、Sticky Bit
  6. 常见场景与最佳实践
  7. 总结
  8. 参考

1. 权限基础:三组用户#

在深入 rwx 之前,必须了解权限施加的对象。每个文件和目录都有三组权限,分别对应三类用户:

  • 所有者(Owner/u):文件或目录的创建者。
  • 所属组(Group/g):文件或目录所属的用户组。
  • 其他用户(Others/o):系统上不属于上述两类的所有其他用户。

这三组权限依次排列,形成了 ls -l 输出中的 9 个字符(例如 rwxr-xr--)。

2. 文件的 rwx 权限详解#

2.1 读权限 -r#

  • 真正含义:允许读取文件的内容。
  • 具体操作
    • 使用 cat, less, more, head, tail 等命令查看文件内容。
    • 在文本编辑器(如 vimnano)中打开文件以查看(但不一定修改)。
    • 复制文件内容(例如,使用 cp 命令复制一个你有读权限的文件)。
  • 没有读权限时:尝试上述操作会得到 "Permission denied" 错误。即使文件有执行权限,如果没有读权限,某些脚本解释器可能无法读取脚本内容,导致执行失败。

2.2 写权限 -w#

  • 真正含义:允许修改文件的内容和元数据
  • 具体操作
    • 使用文本编辑器修改并保存文件内容。
    • 使用 echo "text" > filesed -i 等命令重写或修改文件。
    • 截断文件(truncate)。
    • 更改文件的某些元数据,如时间戳(但更改所有者、组名需要更高权限)。
  • 重要提示删除一个文件不取决于文件本身的写权限,而是取决于其所在目录的写权限。这是一个最常见的误解。

2.3 执行权限 -x#

  • 真正含义:允许将文件作为可执行程序或脚本来运行。
  • 具体操作
    • 如果文件是二进制可执行文件(如 /bin/bash),可以直接通过路径执行(./my_program)。
    • 如果文件是脚本(如 Python 脚本 .py 或 Bash 脚本 .sh),需要同时具备读权限(以便解释器读取代码)和执行权限。
  • 没有执行权限时:尝试执行文件会得到 "Permission denied" 错误。即使文件内容是可执行的代码。

3. 目录的 rwx 权限详解(关键区别)#

这是理解 Linux 权限的核心。请将目录视为一个文件夹索引表,它包含了其下文件和子目录的条目(名称和 inode 指针)。

3.1 读权限 d-r#

  • 真正含义:允许读取目录内容列表的名称
  • 具体操作:可以使用 ls 命令列出目录下的文件和子目录名称
  • 限制:仅有读权限,你无法获取这些文件的详细信息(如大小、权限,需要 ls -l),也无法访问(cd)到该目录或其子目录。
  • 没有读权限时ls 命令会失败,但如果你有执行权限,你仍然可以访问你知道确切名称的文件。

3.2 写权限 d-w#

  • 真正含义:允许修改目录的条目列表。
  • 具体操作
    • 在目录内创建新文件或子目录(touch, mkdir)。
    • 删除目录内的文件或子目录(rm, rmdir)。
    • 在目录内重命名文件或子目录(mv)。
  • 关键点删除文件的能力由此权限控制。只要你对目录有写权限,你就可以删除该目录下的文件——即使你对该文件本身没有写权限!(这可以通过 Sticky Bit 限制,见后文)。

3.3 执行权限 d-x(最重要的目录权限)#

  • 真正含义:允许访问目录内的项目(即穿越,access)。
  • 具体操作
    • 使用 cd 命令进入该目录。
    • 访问(读、写、执行)目录内已知名称的文件和子目录。这是执行任何目录内操作的基础。
  • 组合使用
    • --x:你可以 cd 到目录,并访问已知名称的文件,但无法列出目录内容(因为无 r)。
    • r-x:你可以列出目录内容(ls)并访问其中的文件(cd)。
    • -wx:你可以进入目录并在其中创建/删除文件,但无法列出已有文件(一种隐蔽的目录用法)。
    • rwx:拥有所有权限。

总结对比表

权限对文件的影响对目录的影响
r (读)读取文件内容列出目录内容(看文件名)
w (写)修改文件内容/元数据在目录中创建/删除/重命名文件
x (执行)将文件作为程序执行进入目录(cd)并访问其中内容

4. 权限操作实战#

4.1 查看权限:ls -l#

$ ls -l
drwxr-xr-x 2 user group 4096 Apr 10 10:00 my_directory/
-rw-r--r-- 1 user group  123 Apr 10 10:00 my_file.txt
-rwxr-xr-x 1 user group 845 Apr 10 10:00 my_script.sh

第一个字符:d 表示目录,- 表示普通文件。随后三组 rwx 分别对应所有者、组和其他用户的权限。- 表示无该权限。

4.2 更改权限:chmod 命令#

方法一:符号法(直观) 格式:chmod [ugoa][+-=][rwx] file

  • u:用户(所有者),g:组,o:其他,a:所有
  • +:添加权限,-:移除权限,=:设置精确权限

示例

# 为所有用户添加执行权限
chmod a+x my_script.sh
 
# 移除组和其他用户的写权限
chmod go-w my_file.txt
 
# 为目录设置权限:所有者读写执行,组读执行,其他无权限
chmod u=rwx,g=rx,o= my_directory/

方法二:八进制法(高效) 将每组权限视为一个二进制数(r=4, w=2, x=1),然后相加得到一个数字。

  • rwx = 4+2+1 = 7
  • rw- = 4+2+0 = 6
  • r-x = 4+0+1 = 5
  • r-- = 4+0+0 = 4

示例

# 755: 所有者rwx,组r-x,其他r-x
chmod 755 my_script.sh
 
# 644: 所有者rw-,组r--,其他r-- (文件常用)
chmod 644 my_file.txt
 
# 700: 所有者rwx,组无权限,其他无权限 (私人目录)
chmod 700 my_private_dir/

4.3 设置默认权限:umask#

umask 值决定了新创建文件或目录的默认权限。它是一个"掩码",从完全权限中减去对应值。

  • 文件的完全权限:666 (-rw-rw-rw-)
  • 目录的完全权限:777 (drwxrwxrwx)
  • 常见 umask:022

计算新文件权限666 - 022 = 644 -> -rw-r--r-- 计算新目录权限777 - 022 = 755 -> drwxr-xr-x

查看和设置 umask:

# 查看当前 umask
umask
 
# 设置 umask (例如,更严格的 077,仅所有者有权限)
umask 077

(通常将 umask 设置写入 ~/.bashrc 或全局配置中)

5. 特殊执行权限:SUID、SGID、Sticky Bit#

这些权限占用执行权限 x 的位置,具有特殊功能。

特殊权限符号法八进制法对文件的影响对目录的影响
SUIDu+s4000程序运行时以文件所有者的身份运行,而非执行者。(通常无意义)
SGIDg+s2000程序运行时以文件所属组的身份运行。在该目录下创建的新文件,其所属组自动继承目录的所属组。
Sticky Bito+t1000(在现代系统中已废弃)目录内的文件只能由文件所有者、目录所有者或 root 删除。即使目录是 rwxrwxrwx

示例

# 著名的 passwd 命令,普通用户需要临时拥有 root 权限来修改 /etc/shadow
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 63960 Feb  7  2023 /usr/bin/passwd
# `s` 代替了所有者执行位 `x`,表示 SUID
 
# 为共享目录设置 SGID 和 Sticky Bit
chmod 2770 /shared_workspace/  # rwxrws--- (SGID)
chmod 1777 /tmp/               # rwxrwxrwt (Sticky Bit)

6. 常见场景与最佳实践#

场景与解决方案#

  1. "Permission denied" when trying to run a script?

    • 原因:脚本缺少执行权限。
    • 解决chmod +x script.sh
  2. Cannot delete a file even though I own it?

    • 原因:你对你所在目录没有写权限。
    • 解决:检查并修改父目录的权限:ls -ld /path/to/parent/dir
  3. Cannot cd into a directory?

    • 原因:目录缺少执行权限。
    • 解决chmod o+x /path/to/directory (如果是对其他用户)
  4. Creating a shared directory for a team?

    • 方案
      • 创建一个共享组(groupadd teamusermod -aG team user1 user2)。
      • 创建目录:mkdir /team_workspace
      • 设置目录所有者为该组:chown :team /team_workspace
      • 设置权限为 2770chmod 2770 /team_workspace。这确保了:
        • 所有者和组有完全权限。
        • 新创建的文件自动属于 team 组。
        • 其他用户无任何权限。

最佳实践#

  • 遵循最小权限原则:只授予必要的权限。例如,配置文件通常只需 644,私有文件用 600
  • 目录至少需要 rx 权限:否则用户无法访问其中的内容。
  • 谨慎使用 777:这会给所有用户完全的读写执行权限,是巨大的安全风险。
  • 善用组和 SGID:对于团队协作,使用组权限和 SGID 比放开 o 权限更安全、更可控。
  • 理解 /tmp/var/tmp:它们通常有 Sticky Bit (1777),允许任何人创建文件,但只允许所有者删除。

7. 总结#

Linux 的 rwx 权限是一个强大而基础的安全模型。其核心在于深刻理解文件权限目录权限之间的本质区别:

  • 文件,权限控制的是数据流:读内容、改内容、执行程序。
  • 目录,权限控制的是条目管理:列表名、增删条目、访问条目内容(x)。

掌握这些真正含义,结合 chmodchownumask 等工具,以及 SUID、SGID、Sticky Bit 等高级特性,你将能够精确地控制 Linux 系统的访问权限,从而构建出既安全又高效的运行环境。

8. 参考#

  1. man 1 chmod
  2. man 1 chown
  3. man 2 umask
  4. man 7 inode (查看 inode 和文件元数据的概念)
  5. Linux Filesystem Hierarchy Standard (FHS)
  6. GNU Coreutils 文档