Linux 用户与文件权限
一、 Linux 用户 (Users)
在 Linux 系统中,每个可以登录或执行进程的实体都被视为一个用户。系统通过一个唯一的 UID(User ID,用户标识号)来识别每个用户。
根据角色和权限,用户大致可以分为三类:
超级用户 (Root User)
- 用户名:
root - UID: 0
- 描述:
root用户是系统的最高权限所有者,拥有对系统上所有文件和进程的完全控制权。它可以执行任何操作,包括安装软件、修改系统配置、删除关键文件等。因此,日常操作中应极力避免直接使用root账户,推荐使用普通用户并通过sudo命令临时获取超级权限。
- 用户名:
系统用户 (System Users)
- UID: 通常在 1 到 999 之间(不同发行版可能范围不同)。
- 描述: 这些用户不是为人类登录而设计的,而是为系统服务或后台进程(守护进程)运行而创建的。例如,
www-data(Apache) 或mysql(MySQL) 用户。为服务分配独立用户可以限制该服务的能力范围,提高系统安全性。
普通用户 (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(读) = 4w(写) = 2x(执行) = 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 个八进制数字分别对应 User、Group 和 Others。
示例(常见权限):
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.sh2. 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/dir3. chgrp (Change Group)
chgrp 命令专门用于更改文件或目录的所属组。
bash
# 将 file.txt 的所属组更改为 new_group
sudo chgrp new_group file.txt