Skip to content

Linux 用户与文件权限

一、 Linux 用户 (Users)

在 Linux 系统中,每个可以登录或执行进程的实体都被视为一个用户。系统通过一个唯一的 UID(User ID,用户标识号)来识别每个用户。

根据角色和权限,用户大致可以分为三类:

  1. 超级用户 (Root User)

    • 用户名: root
    • UID: 0
    • 描述: root 用户是系统的最高权限所有者,拥有对系统上所有文件和进程的完全控制权。它可以执行任何操作,包括安装软件、修改系统配置、删除关键文件等。因此,日常操作中应极力避免直接使用 root 账户,推荐使用普通用户并通过 sudo 命令临时获取超级权限。
  2. 系统用户 (System Users)

    • UID: 通常在 1 到 999 之间(不同发行版可能范围不同)。
    • 描述: 这些用户不是为人类登录而设计的,而是为系统服务或后台进程(守护进程)运行而创建的。例如,www-data (Apache) 或 mysql (MySQL) 用户。为服务分配独立用户可以限制该服务的能力范围,提高系统安全性。
  3. 普通用户 (Regular Users)

    • UID: 通常从 1000 开始。
    • 描述: 这是为系统操作者(人类用户)创建的账户。普通用户在其家目录(通常是 /home/username)中拥有完全权限,但在系统其他位置的权限受到严格限制。

相关命令:

  • useradd [用户名]:创建新用户。
  • passwd [用户名]:设置或修改用户密码。
  • usermod [选项] [用户名]:修改用户属性。
  • userdel [用户名]:删除用户。

二、 Linux 组 (Groups)

为了简化对多个用户的权限管理,Linux 引入了 组 (Groups) 的概念。每个组也有一个唯一的 GID(Group ID,组标识号)。

  • 基本组 (Primary Group): 每个用户必须属于一个且仅一个基本组。通常在创建用户时,系统会自动创建一个同名的组作为其基本组。用户创建的文件默认属于该组。
  • 附加组 (Secondary/Supplementary Groups): 一个用户可以同时属于多个附加组。这使得用户可以访问不属于其基本组的其他组所拥有的资源。

相关命令:

  • groupadd [组名]:创建新组。
  • groupmod [选项] [组名]:修改组属性。
  • groupdel [组名]:删除组。
  • usermod -aG [组名] [用户名]:将用户添加到一个附加组(-a 意为追加,-G 指定附加组)。
  • groups [用户名]:查看用户所属的组。

三、 文件权限详解

Linux 文件权限是整个系统的基石。使用 ls -l 命令可以查看文件或目录的详细信息,其输出格式如下:

bash
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1233848 5月  13 20:31 /bin/bash

我们来分解这行信息的关键部分:

[ -rwxr-xr-x ] [ 1 ] [ root ] [ root ] ...

1. 文件类型与权限位(-rwxr-xr-x

这 10 个字符详细定义了文件的类型和权限。

第 1 位:文件类型

  • -:普通文件(Regular file)。
  • d:目录(Directory)。
  • l:符号链接(Symbolic link)。
  • b:块设备文件(Block device),如硬盘。
  • c:字符设备文件(Character device),如终端。
  • s:套接字文件(Socket)。

第 2-10 位:权限描述(分为三组)

这 9 个字符被平均分为三组,每组 3 个字符(rwx):

  • 第 2-4 位:所有者权限 (User/Owner)
    • 定义了文件的所有者(上例中的第一个 root)对该文件的权限。
  • 第 5-7 位:所属组权限 (Group)
    • 定义了文件所属组(上例中的第二个 root)内的成员对该文件的权限。
  • 第 8-10 位:其他用户权限 (Others)
    • 定义了既不是所有者,也不属于所属组的其他所有用户对该文件的权限。

2. r, w, x 的含义

r, w, x 分别代表读、写、执行。但它们对文件和目录的意义不同:

权限对文件 (File) 的含义对目录 (Directory) 的含义
r (Read)可以读取文件的内容可以列出(如 ls)目录中的文件列表
w (Write)可以修改文件的内容可以在目录中创建、删除、重命名文件。(**注意:这很关键!)
x (Execute)可以将文件作为程序执行**。可以进入 (cd) 该目录,并访问目录内的文件(需配合 r)。

关键点: 如果你对一个目录有 w 权限,即使你对该目录下的某个文件没有 w 权限,你依然可以删除该文件。


四、 修改权限与归属

1. chmod (Change Mode)

chmod 命令用于修改文件或目录的权限。它有两种模式:

a. 符号模式 (Symbolic Mode)

这是最直观的模式:

  • 操作对象 (Who): u (user), g (group), o (others), a (all, ugo)
  • 操作符 (Operator): + (添加), - (移除), = (设置)
  • 权限 (Permission): r, w, x

示例:

bash
# 为所有者添加执行权限
chmod u+x script.sh

# 为组和其他用户移除写权限
chmod go-w data.txt

# 为所有人设置读权限,但只有所有者可写
chmod a=r,u+w config.ini

# 对目录及其下所有内容递归添加组的写权限
chmod -R g+w project_dir/

b. 八进制模式 (Octal Mode)

这是更快捷、更常用的模式。它使用数字来表示权限组合:

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

权限通过将数字相加得到:

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

chmod 命令使用 3 个八进制数字分别对应 UserGroupOthers

示例(常见权限):

bash
# rwxr-xr-x (所有者可读写执行,组和他人可读可执行)
# 常见于脚本或程序
chmod 755 script.sh

# rw-r--r-- (所有者可读写,组和他人只读)
# 常见于普通数据文件
chmod 644 document.txt

# rwx------ (只有所有者可读写执行)
# 常见于私密文件或密钥
chmod 700 private_key

# rwxr-x--- (所有者可读写执行,组可读可执行,他人无权限)
# 适用于团队协作项目
chmod 750 shared_script.sh

2. chown (Change Owner)

chown 命令用于更改文件或目录的所有者所属组

bash
# 将 file.txt 的所有者更改为 a_user
# (此操作通常需要 sudo)
sudo chown a_user file.txt

# 同时更改所有者为 a_user,所属组为 a_group
sudo chown a_user:a_group file.txt

# 只更改所属组
sudo chown :a_group file.txt

# 递归更改目录的所有者和组
sudo chown -R a_user:a_group /path/to/dir

3. chgrp (Change Group)

chgrp 命令专门用于更改文件或目录的所属组

bash
# 将 file.txt 的所属组更改为 new_group
sudo chgrp new_group file.txt