Skip to main content

Linux 用户与权限

Linux 基础权限管理

Linux 权限管理是操作系统安全的基础,用于控制用户和进程对文件和目录的访问权限。本文详细讲解 Linux 权限管理的核心概念,涵盖文件类型、角色分类(UGO)、权限类型(rwx)、符号表示法、数字表示法、权限掩码(umask)、特殊权限位、查看和修改权限的方法,以及常见问题与注意事项。

1. Linux 权限管理简介

Linux 是一个多用户操作系统,权限管理确保用户只能访问被授权的资源。权限管理涉及文件和目录的访问控制,基于用户身份(谁)、资源类型(是什么)以及允许的操作(能做什么)。以下是权限管理的核心目标:

  • 安全性:防止未经授权的访问或修改。
  • 灵活性:支持细粒度的权限分配。
  • 协作性:允许多用户共享资源,同时保护隐私。

权限管理主要通过文件系统实现,结合用户、组和权限设置来控制访问行为。

2. 文件类型

Linux 文件系统支持多种文件类型,文件类型决定了权限的适用方式。使用 ls -l 命令查看文件时,第一个字符表示文件类型。常见文件类型包括:

  • 普通文件(-):包含数据(如文本、图片、二进制文件)。示例:file.txt
  • 目录(d):用于组织文件,类似文件夹。示例:/home/user
  • 符号链接(l):指向另一个文件或目录的快捷方式,权限通常对其目标生效。示例:link -> file.txt
  • 块设备(b):表示硬件设备,如硬盘或 USB 驱动器。示例:/dev/sda
  • 字符设备(c):表示串行数据流设备,如终端。示例:/dev/tty
  • 命名管道(p):用于进程间通信。示例:/tmp/pipe
  • 套接字(s):用于进程间网络通信。示例:/var/run/docker.sock

查看文件类型

ls -l /path/to/file

示例输出:

-rw-r--r--  1 user group  1234 Aug 12 2025 file.txt
drwxr-xr-x  2 user group  4096 Aug 12 2025 directory
lrwxrwxrwx  1 user group    10 Aug 12 2025 link -> file.txt

注意:不同文件类型的权限行为有所不同。例如,目录的执行权限(x)决定是否可以进入,而普通文件的执行权限决定是否可以运行。

3. 角色分类(UGO)

Linux 权限基于 UGO 模型,将访问者分为三类角色:

  • 用户(User, u):文件或目录的拥有者,通常是创建文件的用户。拥有者对文件有最高控制权,可修改权限或删除文件。
  • 组(Group, g):与文件关联的用户组,组内成员共享相同的权限。组适合团队协作,允许多用户共享资源。
  • 其他(Others, o):系统中除拥有者和组成员外的所有用户。其他用户的权限通常最严格,以保护文件。

查看文件拥有者和组

ls -l

示例输出:

-rw-r--r-- 1 alice developers 1234 Aug 12 2025 file.txt
  • alice 是文件拥有者。
  • developers 是文件所属组。

4. 权限类型(rwx)

Linux 定义了三种基本权限类型,适用于文件和目录:

  • 读(Read, r)
    • 文件:允许读取文件内容(如 cat file.txt)。
    • 目录:允许列出目录内容(如 ls dir)。
  • 写(Write, w)
    • 文件:允许修改或删除文件内容。
    • 目录:允许在目录中创建、删除或重命名文件。
  • 执行(Execute, x)
    • 文件:允许运行文件(如脚本或二进制程序)。
    • 目录:允许进入目录(如 cd dir)或访问目录内文件的元数据。

注意:权限对文件和目录的差异:

权限 文件 目录
r 读取内容(如 catless 列出内容(如 ls
w 修改或删除内容 创建、删除或重命名文件(如 touchrm
x 运行文件(如 ./script.sh 进入目录(如 cd)或访问文件元数据
  • 目录的写权限(w)需要配合执行权限(x),否则无法操作目录内容。
  • 没有执行权限的目录无法进入,即使有读权限也只能列出内容。

5. 符号表示法

权限通过符号表示法以直观的方式展示,格式为 10 个字符:

-rwxr-xr-x
  • 第 1 位:文件类型(如 - 表示普通文件,d 表示目录)。
  • 第 2-4 位:用户(u)的权限(rwx)。
  • 第 5-7 位:组(g)的权限(rwx)。
  • 第 8-10 位:其他(o)的权限(rwx)。

若某权限缺失,则用 - 表示。例如:

  • -rwxr-xr-x:拥有者有读、写、执行权限;组和其他用户有读、执行权限。
  • -rw-------:仅拥有者有读、写权限,组和其他用户无权限。
  • drwxr-xr--:目录,拥有者有全部权限,组有读、执行权限,其他用户只有读权限。

示例解析

-rwxr-xr-x 1 alice developers 1234 Aug 12 2025 script.sh
  • 文件类型:普通文件(-)。
  • 权限:拥有者(alice)有 rwx,组(developers)有 r-x,其他用户有 r-x。

6. 数字表示法

Linux 还支持八进制数字表示权限,每组权限(u、g、o)用一个 0-7 的数字表示:

  • r(读) = 4
  • w(写) = 2
  • x(执行) = 1
  • 无权限 = 0

通过将权限值相加,计算每组权限的数字。例如:

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

权限字符串的数字表示法由三个数字组成,分别对应 u、g、o。例如:

  • -rwxr-xr-x = 755(7 = rwx, 5 = r-x, 5 = r-x)。
  • -rw------- = 600(6 = rw-, 0 = ---, 0 = ---)。
  • drwxr-xr-- = 754(7 = rwx, 5 = r-x, 4 = r--)。

转换示例

  • 要将 rwxr-xr-- 转换为数字:
    • 用户:rwx = 7
    • 组:r-x = 5
    • 其他:r-- = 4
    • 结果:754

7. 权限掩码(umask)

umask(用户权限掩码)决定新建文件或目录的默认权限。umask 是一个八进制值,表示从默认权限中减去的权限位。

  • 默认权限
    • 文件的默认权限:666(rw-rw-rw-,文件默认无执行权限)。
    • 目录的默认权限:777(rwxrwxrwx)。

计算公式

新建权限 = 默认权限 - umask

示例

  • umask 为 022
    • 新建文件的权限为:666 - 022 = 644(rw-r--r--)
    • 新建目录的权限为:777 - 022 = 755(rwxr-xr-x)
  • umask 为 077
    • 新建文件的权限为:666 - 077 = 600(rw-------)
    • 新建目录的权限为:777 - 077 = 700(rwx------)

查看和设置 umask

在用户配置文件(如 ~/.bashrc)中设置永久 umask:

echo "umask 022" >> ~/.bashrc

设置 umask:

umask 022

查看当前 umask:

umask

输出示例:0022(通常以四位八进制表示,前导 0 表示无特殊权限)。

注意

  • umask 只影响新建文件和目录,不影响已有文件。
  • 常见的 umask 值包括 022(默认,组和其他用户无写权限)和 002(组用户可写,适合协作环境)。

8. 特殊权限位

Linux 提供三种特殊权限位,用于增强文件或目录的功能:

  • SUID(Set User ID, 4)
    • 应用于可执行文件,运行时以文件拥有者的权限执行,而非调用者的权限。
    • 示例:/usr/bin/passwd 使用 SUID,普通用户可以以 root 权限修改 /etc/shadow
    • 符号表示:用户权限的 x 位置显示为 s(有执行权限)或 S(无执行权限)。
    • 示例:-rwsr-xr-x(SUID 生效)。
  • SGID(Set Group ID, 2)
    • 文件:运行时以文件所属组的权限执行。
    • 目录:新建文件继承目录的所属组,适合团队共享目录。
    • 符号表示:组权限的 x 位置显示为 s(有执行权限)或 S(无执行权限)。
    • 示例:drwxr-sr-x(目录的 SGID)。
  • Sticky Bit(1)
    • 应用于目录,仅文件拥有者或 root 可删除目录中的文件,即使其他用户有写权限。
    • 示例:/tmp 目录通常设置 Sticky Bit,防止用户删除他人的临时文件。
    • 符号表示:其他权限的 x 位置显示为 t(有执行权限)或 T(无执行权限)。
    • 示例:drwxrwxrwt(Sticky Bit 生效)。

设置特殊权限

  • 使用 chmod 的数字表示法,在常规权限前加一位:
    • SUID:4xxx(如 4755
    • SGID:2xxx(如 2755
    • Sticky Bit:1xxx(如 1777

使用符号表示法:

chmod u+s executable_file  # 设置 SUID
chmod g+s shared_dir      # 设置 SGID
chmod +t /tmp             # 设置 Sticky Bit

示例:

chmod 4755 executable_file  # 设置 SUID
chmod 2755 shared_dir       # 设置 SGID
chmod 1777 /tmp             # 设置 Sticky Bit

注意

  • SUID 和 SGID 需谨慎使用,可能引入安全风险。
  • Sticky Bit 对文件无实际作用,仅对目录有效。

9. 查看权限方法

以下是查看文件和目录权限的常用方法:

ls -l

ls -l /path/to/file

示例输出:

-rwxr-xr-x  1 alice developers  1234 Aug 12 2025 script.sh
drwxr-sr-x  2 bob   team       4096 Aug 12 2025 shared_dir
    • 第一列:文件类型和权限。
    • 第二列:硬链接数。
    • 第三列:文件拥有者。
    • 第四列:所属组。
    • 第五列:文件大小(字节)。
    • 第六列:最后修改时间。
    • 第七列:文件名。

stat: 提供详细文件信息,包括权限、文件类型、访问时间等。

stat file.txt

示例输出:

  File: file.txt
  Size: 1234         Blocks: 8          IO Block: 4096   regular file
Access: (0644/-rw-r--r--)  Uid: ( 1000/   alice)   Gid: ( 1000/ developers)

lsattr: 查看文件属性(可能包括权限相关标志)。

lsattr file.txt

提示:使用 ls -la 查看隐藏文件(如 .bashrc)的权限。

10. 修改权限和所有权

10.1 修改权限(chmod)

使用 chmod(change mode)修改文件或目录的权限,支持符号和数字表示法。

符号表示法

chmod u+x script.sh       # 给拥有者添加执行权限
chmod g-w file.txt        # 移除组的写权限
chmod o=r file.txt        # 设置其他用户只有读权限
chmod u=rwx,g=rx,o=r file.txt  # 同时设置多组权限

数字表示法

chmod 755 script.sh  # rwxr-xr-x
chmod 644 file.txt   # rw-r--r--
chmod 4755 binary    # 设置 SUID,rwxr-xr-x

递归修改

chmod -R 755 /path/to/dir  # 递归修改目录及其内容

注意

  • 普通用户只能修改自己拥有的文件的权限。
  • root 用户可以修改任何文件的权限。

10.2 修改拥有者和组

chown(change owner): 修改文件拥有者或组。

chown bob file.txt           # 更改拥有者为 bob
chown bob:team file.txt      # 更改拥有者和组
chown -R alice:developers /path/to/dir  # 递归修改

chgrp(change group): 修改文件所属组。

chgrp team file.txt
chgrp -R team /path/to/dir  # 递归修改

注意

  • 普通用户只能将文件组改为自己所属的组。
  • root 用户可以更改任何文件的所有权。

11. 常见问题与注意事项

  • 权限不足
    • 如果收到 Permission denied,检查文件权限、拥有者或组。
    • 使用 sudo 临时提升权限(需 root 权限) sudo chmod 755 script.sh
  • 目录权限问题
    • 无法进入目录:检查目录的 x 权限。
    • 无法删除文件:检查目录的 w 权限或 Sticky Bit。
  • SUID/SGID 安全风险
    • SUID 文件可能被恶意利用,定期检查:find / -perm -4000 # 查找所有 SUID 文件
  • umask 配置
    • 默认 umask(通常为 022)可能不适合协作环境,考虑调整为 002
    • 检查系统全局 umask(通常在 /etc/profile/etc/login.defs 中)。
  • 符号链接权限
    • 符号链接的权限通常对其目标文件生效,直接修改链接的权限无效。
  • 调试权限问题
    • 使用 strace 跟踪权限相关的系统调用:strace -e access command

12. 总结

Linux 权限管理通过文件类型、UGO 模型、rwx 权限、符号和数字表示法、umask、特殊权限位等机制,提供细粒度的访问控制。

掌握 ls -lstat 等查看权限的方法,以及 chmodchownchgrp 等修改权限的命令,是管理 Linux 系统的基础。

理解特殊权限(如 SUID、SGID、Sticky Bit)和 umask 的作用,可以应对复杂场景,同时注意安全性和常见问题,确保系统安全与高效协作。