Linux的权限详解
在Linux系统中,权限与分组是实现多用户安全隔离、资源管控的核心机制。其设计理念是“最小权限原则”——即每个用户/进程仅获得完成任务所需的最小权限,从而保障系统稳定与数据安全。下面将从核心概念、用户组、权限模型、命令操作到实战案例,全面讲解Linux权限与分组。
一、核心基础:Linux的“用户-组-其他”模型
Linux是多用户多任务操作系统,所有文件/目录的权限都围绕3类主体设计,形成“用户→组→其他”的三层管控体系:
- 用户(User):系统中每个账号对应一个独立用户(如
root
、alice
),每个用户有唯一的UID
(用户ID)标识。 - 组(Group):多个用户的集合(如
dev
组、admin
组),用于批量管理权限(避免对每个用户单独设置权限),每个组有唯一的GID
(组ID)。 - 其他(Other):既不是文件所有者,也不属于文件所属组的所有用户,是“默认兜底”的权限对象。
二、用户与用户组详解
要理解权限,需先掌握用户与组的分类、管理逻辑及配置文件。
1. 用户类型(按UID划分)
Linux通过UID
(User ID)区分用户身份,不同UID
范围对应不同用户类型:
用户类型 | UID范围 | 作用说明 |
---|---|---|
超级用户(root) | UID=0 | 拥有系统最高权限,可操作所有文件/命令(如删除系统文件、修改其他用户权限) |
普通用户 | UID 1000~60000 | 由管理员创建,仅拥有自身目录(/home/用户名 )及授权资源的操作权限 |
系统用户 | UID 1~999 | 系统服务(如nginx 、mysql )专用,无登录权限,仅用于运行服务进程 |
2. 用户组类型(按关联方式划分)
每个用户至少属于一个组,最多可属于多个组,分为两类:
- 主组(Primary Group):用户默认所属的组,创建用户时自动生成(默认与用户名同名),用户的所有新文件默认属于主组。
例:创建用户alice
时,会自动创建alice
组作为其主组。 - 附加组(Supplementary Group):用户额外加入的组,用于获取该组的权限(如加入
dev
组以访问开发目录)。
例:alice
的主组是alice
,附加组是dev
,则她同时拥有alice
组和dev
组的权限。
3. 关键配置文件(用户/组信息存储)
用户与组的信息存储在以下3个系统文件中,直接修改文件需谨慎(建议用命令管理):
配置文件路径 | 作用说明 |
---|---|
/etc/passwd | 存储所有用户的基础信息(用户名、UID、主组GID、家目录、登录shell等) |
/etc/group | 存储所有组的信息(组名、GID、组内用户列表) |
/etc/shadow | 存储用户的加密密码、密码过期时间等敏感信息(仅root 可读取) |
三、文件/目录的权限模型
Linux中所有文件/目录都有明确的权限属性,权限分为“对象”和“操作类型”两部分,通过ls -l
命令可查看。
1. 权限的3个核心对象
权限始终针对以下3类对象设置,简称“u/g/o”:
- u(Owner):文件/目录的所有者(创建者默认是所有者,可通过命令修改)。
- g(Group):文件/目录的所属组(默认是所有者的主组,可修改)。
- o(Other):除“所有者”和“所属组”外的所有其他用户。
- (扩展)a(All):表示“u+g+o”,即所有用户。
2. 3种基础权限类型(r/w/x)
每种对象可拥有“读、写、执行”3种权限,不同权限对文件和目录的意义不同(这是高频混淆点,需重点区分):
权限符号 | 数字值 | 对文件的作用 | 对目录的作用 |
---|---|---|---|
r(Read) | 4 | 可读取文件内容(如cat 、less ) | 可列出目录内的文件(如ls ) |
w(Write) | 2 | 可修改文件内容(如vim 、echo ) | 可创建/删除/重命名目录内的文件 |
x(Execute) | 1 | 可执行文件(如./script.sh ) | 可进入目录(如cd ) |
注意:
- 目录的
w
权限不代表修改目录本身,而是修改目录内的文件(如删除test.txt
);- 若要进入目录并查看文件,需同时拥有目录的
x
(进入)和r
(列出)权限。
3. 权限的两种表示方法
权限有“符号表示法”和“数字表示法”两种,前者直观,后者简洁,实际操作中两者都会用到。
(1)符号表示法(直观易读)
通过rwx
的组合表示权限,格式为:[文件类型][u权限][g权限][o权限]
例:-rw-r--r--
拆解如下:
- 首字符
-
:文件类型(-
=普通文件,d
=目录,l
=软链接); rw-
:所有者(u)权限:可读、可写、不可执行;r--
:所属组(g)权限:可读、不可写、不可执行;r--
:其他用户(o)权限:可读、不可写、不可执行。
常见符号权限组合:
rwxr-xr-x
:所有者可读写执行,组和其他用户可读执行(常用于可执行程序/脚本);rw-rw-r--
:所有者和组可读写,其他用户可读(常用于团队共享文档);rwxr-----
:仅所有者和组可读写执行,其他用户无权限(常用于敏感目录)。
(2)数字表示法(简洁高效)
将r=4
、w=2
、x=1
视为数值,通过“累加”得到每个对象的权限值,格式为:[u数值][g数值][o数值]
例:rw-r--r--
对应数字权限:
- u权限:
r+w
= 4+2 = 6; - g权限:
r
= 4; - o权限:
r
= 4; - 最终数字权限:
644
。
常见数字权限对应关系:
符号权限 | 数字权限 | 适用场景 |
---|---|---|
rwxr-xr-x | 755 | 可执行程序、脚本、公共目录 |
rw-r--r-- | 644 | 普通文档(如txt、md) |
rwxr----- | 740 | 敏感目录(仅所有者和组访问) |
rwxrwxrwt | 1777 | 公共临时目录(如/tmp ) |
四、权限与分组的核心操作命令
掌握以下命令,即可完成“查看-修改-管理”全流程操作,命令均需root
权限或文件所有者权限。
1. 查看权限与分组信息
(1)查看文件/目录权限:ls -l
最常用的命令,可查看文件的权限、所有者、所属组等信息:
# 示例:查看当前目录下的文件权限
ls -l
# 输出格式解析(以 "-rw-r--r-- 1 alice dev 1024 Aug 10 14:30 test.txt" 为例)
# 1. 权限:-rw-r--r-- 2. 硬链接数:1 3. 所有者:alice 4. 所属组:dev
# 5. 文件大小:1024字节 6. 修改时间:Aug 10 14:30 7. 文件名:test.txt
(2)查看当前用户所属组:groups
# 查看当前登录用户的所属组(主组在前,附加组在后)
groups
# 示例输出:alice : alice dev (主组alice,附加组dev)# 查看指定用户的所属组
groups bob
2. 修改文件/目录的所有者与所属组
(1)修改所有者:chown
(Change Owner)
语法:chown [选项] 新所有者[:新所属组] 目标文件/目录
- 选项
-R
:递归修改(用于目录,修改目录及所有子文件/子目录); - 若仅修改所有者,可省略“:新所属组”;若仅修改所属组,可写成“:新所属组”(但更推荐
chgrp
)。
示例:
# 1. 将test.txt的所有者改为bob
chown bob test.txt# 2. 将test.txt的所有者改为bob,所属组改为dev
chown bob:dev test.txt# 3. 递归修改docs目录及其子内容的所有者为alice
chown -R alice docs/
(2)修改所属组:chgrp
(Change Group)
语法:chgrp [选项] 新所属组 目标文件/目录
(功能与chown :新组
一致,更专注于组修改)
示例:
# 将test.txt的所属组改为dev
chgrp dev test.txt# 递归修改docs目录的所属组为admin
chgrp -R admin docs/
3. 修改权限:chmod
(Change Mode)
chmod
支持符号模式和数字模式两种修改方式,灵活度极高。
(1)符号模式(适合局部调整)
语法:chmod [对象][操作符][权限] 目标文件
- 对象:
u
(所有者)、g
(所属组)、o
(其他)、a
(所有); - 操作符:
+
(添加权限)、-
(移除权限)、=
(覆盖权限); - 权限:
r
、w
、x
。
示例:
# 1. 给test.sh的所有者添加执行权限(x)
chmod u+x test.sh# 2. 给docs目录的所属组移除写权限(w)
chmod g-w docs/# 3. 给test.txt的所有用户设置权限为“读+写”(覆盖原有权限)
chmod a=rw test.txt# 4. 给script.sh的所有者读+写+执行,组读+执行,其他无权限(组合写法)
chmod u=rwx,g=rx,o=- script.sh
(2)数字模式(适合整体设置)
直接用3位数字指定权限,语法:chmod [数字权限] 目标文件
示例:
# 1. 将test.sh设置为755(rwxr-xr-x)—— 可执行程序常用
chmod 755 test.sh# 2. 将note.md设置为644(rw-r--r--)—— 普通文档常用
chmod 644 note.md# 3. 递归将data目录设置为740(rwxr-----)—— 敏感目录常用
chmod -R 740 data/
4. 用户组管理命令(创建/删除/添加用户)
要实现分组权限,需先创建组并添加用户,核心命令如下:
命令 | 功能说明 | 示例 |
---|---|---|
groupadd 组名 | 创建新组 | groupadd dev (创建dev开发组) |
useradd 用户名 | 创建新用户(默认创建同名主组) | useradd alice (创建用户alice) |
usermod -aG 组名 用户名 | 将用户添加到附加组(-aG=append Group) | usermod -aG dev alice (alice加入dev) |
groupdel 组名 | 删除空组(组内有用户时需先移除用户) | groupdel old_group |
userdel -r 用户名 | 删除用户并删除家目录(-r=移除家目录) | userdel -r bob |
passwd 用户名 | 给用户设置密码(必须设置密码才能登录) | passwd alice (输入密码时隐藏) |
五、特殊权限(SUID/SGID/Sticky Bit)
除了基础的rwx
,Linux还有3种“特殊权限”,用于解决特定场景下的权限问题(如普通用户执行passwd
修改密码)。
特殊权限 | 符号表示 | 作用说明 | 典型应用场景 |
---|---|---|---|
SUID | s (u位置) | 普通用户执行该程序时,临时拥有程序所有者的权限(仅对可执行文件有效) | passwd 命令(所有者是root,普通用户执行时临时获root权限修改/etc/shadow ) |
SGID | s (g位置) | 1. 对文件:执行时临时拥有文件所属组权限;2. 对目录:新文件继承目录的所属组 | 开发目录(如/dev/project ,新文件自动属于dev 组) |
Sticky Bit | t (o位置) | 仅对目录有效:目录内的文件仅所有者可删除(其他用户即使有w权限也无法删除) | 公共临时目录/tmp (权限rwxrwxrwt ,避免用户删除他人文件) |
示例:
# 给/tmp目录添加Sticky Bit(确保用户仅删除自己的文件)
chmod +t /tmp# 给/dev/project目录添加SGID(新文件继承目录的dev组)
chmod g+s /dev/project
六、常见问题与注意事项
- 目录必须有
x
权限才能cd
进入:即使有r
权限(能ls
),无x
权限也无法进入目录。 root
用户不受普通权限限制:root
可读写/删除任何文件(除非设置了特殊权限如immutable
),操作需谨慎。- 递归修改权限用
-R
:修改目录时若忘记-R
,仅目录本身权限变化,子文件/子目录不变。 - 避免过度开放权限:如
777
(所有用户可读写执行)会导致安全风险,除非是临时测试,否则禁止使用。