
🎬 Doro在努力 :个人主页
🔥 个人专栏 : 《MySQL数据库基础语法》《数据结构》
⛺️严于律己,宽以待人
Linux权限管理深度解析:从sudo到文件权限的完整指南
上节课我们探讨了shell命令的运行原理,今天我们将深入Linux权限管理的核心------从sudo提权机制到文件权限的每一个细节。这不仅是面试的高频考点,更是日常开发和系统管理的必备技能。
文章目录
- Linux权限管理深度解析:从sudo到文件权限的完整指南
-
- 一、课前复习:shell的本质
- 二、sudo权限提升:白名单机制详解
-
- [2.1 为什么需要sudo?](#2.1 为什么需要sudo?)
- [2.2 两种权限提升方式](#2.2 两种权限提升方式)
- [2.3 白名单机制:/etc/sudoers](#2.3 白名单机制:/etc/sudoers)
- [2.4 验证:普通用户无法直接使用sudo](#2.4 验证:普通用户无法直接使用sudo)
- [2.5 为什么这样设计?](#2.5 为什么这样设计?)
- 三、Linux权限的核心概念
-
- [3.1 什么是权限?](#3.1 什么是权限?)
- [3.2 Linux中的三类角色](#3.2 Linux中的三类角色)
- [3.3 文件的三类权限](#3.3 文件的三类权限)
- [四、解读ls -l输出](#四、解读ls -l输出)
-
- [4.1 权限位的固定顺序](#4.1 权限位的固定顺序)
- 五、为什么需要"所属组"?
-
- [5.1 场景:公司内部的赛马机制](#5.1 场景:公司内部的赛马机制)
- [5.2 没有所属组的问题](#5.2 没有所属组的问题)
- [5.3 所属组的解决方案](#5.3 所属组的解决方案)
- 六、修改文件权限:chmod命令
-
- [6.1 字符表示法](#6.1 字符表示法)
- [6.2 八进制表示法](#6.2 八进制表示法)
- 七、修改文件拥有者和所属组
-
- [7.1 chown:修改拥有者](#7.1 chown:修改拥有者)
- [7.2 chgrp:修改所属组](#7.2 chgrp:修改所属组)
- [7.3 同时修改拥有者和所属组](#7.3 同时修改拥有者和所属组)
- 八、关键概念深入理解
-
- [8.1 身份匹配只进行一次](#8.1 身份匹配只进行一次)
- [8.2 可执行权限的本质](#8.2 可执行权限的本质)
- 九、目录权限的特殊性
-
- [9.1 进入一个目录需要什么权限?](#9.1 进入一个目录需要什么权限?)
- [9.2 目录的w权限:一个"危险"的权限](#9.2 目录的w权限:一个"危险"的权限)
- 十、文件类型总结
- 十一、总结
一、课前复习:shell的本质
在进入正题之前,让我们快速回顾一下上节课的核心内容。Linux严格意义上说的是一个操作系统内核(kernel),普通用户不能直接使用kernel,而是通过kernel的"外壳"程序------也就是shell------来与kernel进行沟通。
shell的最简单定义是命令行解释器(command interpreter),它主要完成两个任务:
- 将使用者的命令翻译给核心(kernel)处理
- 将核心的处理结果翻译给使用者
在CentOS和Ubuntu等常见发行版中,我们使用的shell通常是bash。你可以把shell理解为Windows中的图形化界面,或者手机上的安卓系统------它们都是用户与操作系统内核之间的"媒婆"。
二、sudo权限提升:白名单机制详解
2.1 为什么需要sudo?
Linux是一款多用户操作系统,这意味着同一台机器可以同时被多个用户使用。在Linux中,用户分为两类:
- 超级管理员(root):几乎可以做任何事情,不受权限限制
- 普通用户:在做很多工作时受权限管控
在实际工作中,我们经常需要执行一些高权限操作,比如安装软件、修改系统配置等。如果每次都要切换到root用户,不仅麻烦,还存在安全隐患。因此,Linux提供了sudo机制,允许普通用户临时提升权限执行特定命令。
2.2 两种权限提升方式
在Linux中,我们有两种方式获得超级用户权限:
方式一:用户切换(su)
bash
su - # 切换到root用户,需要输入root密码
这种方式会将当前用户完全切换为root用户,适合需要连续执行多个管理操作的场景。
方式二:命令提权(sudo)
bash
sudo mkdir /system/dir # 以root权限执行单个命令
这种方式更加精细,只需要在执行特定命令时提升权限,执行完毕后自动回到普通用户状态。
2.3 白名单机制:/etc/sudoers
现在有一个关键问题:如果任何人都可以使用sudo提权,那普通用户和root用户还有什么区别?权限岂不是形同虚设?
为了解决这个问题,Linux引入了一个白名单机制。让我们通过一个生动的例子来理解:
假设你想进入一所学校,保安会要求你出示学生证。如果你没有学生证,但你是校长的亲戚,保安可能会打电话确认后让你进去,并在他的"白色小本本"上记下你的名字。下次你再来的时候,保安一看本子上有你的名字,就直接放行了。这就是白名单------名单上的人免审核直接通过。
反过来,如果有人来闹事被赶走了,保安会在他的"黑色小本本"上记下这个人,下次再来直接拒绝。这就是黑名单。
在Linux中,/etc/sudoers文件就是这个"白色小本本"。只有在这个文件中被明确列出的用户,才能使用sudo命令。

2.4 验证:普通用户无法直接使用sudo
让我们做一个实验来验证这一点。首先,root用户创建一个新用户:
bash
# 以root身份执行
adduser lisi # 创建用户lisi
passwd lisi # 设置密码
然后,以lisi身份登录,尝试使用sudo:
bash
# 以lisi身份执行
sudo mkdir /testdir
你会看到如下报错:
lisi is not in the sudoers file. This incident will be reported.
这说明lisi不在白名单中,无法使用sudo。只有root用户将lisi添加到/etc/sudoers文件中,lisi才能获得sudo权限。
2.5 为什么这样设计?
这种设计的精妙之处在于可追溯性。假设一台服务器上有10个用户,其中只有3个在白名单中。如果某天服务器出现了问题,管理员首先会检查这3个有sudo权限的用户的历史操作记录。这样既保证了必要的灵活性,又确保了安全性------你无法偷偷做坏事而不被发现。
三、Linux权限的核心概念
3.1 什么是权限?
在深入技术细节之前,让我们先思考一个哲学问题:什么是权限?
想象一下这些场景:
- 你想在爱奇艺上看一部VIP电影,但作为普通游客只能试看5分钟------你没有观看权限
- 你想去校长办公室查成绩,但保安拦住了你------你没有进入权限
权限的本质是什么?是能还是不能的问题。有权限就能做,没权限就不能做。
但更深层次的思考是:权限限制的是"人"还是"角色"?
- 校长能进校长办公室,是因为他叫"张三",还是因为他是校长?
- 老板能自由出入公司任何地方,是因为他叫"李四",还是因为他是老板?
- 你能看VIP电影,是因为你叫"王五",还是因为你是VIP会员?
答案是:权限限制的是角色,而不是具体的人。
你这个人从出生到死亡一直没变,但在人生的不同阶段会扮演不同角色:在家里你是儿子/女儿,在学校你是学生,在公司你是员工。权限系统正是基于这种角色划分来工作的。
3.2 Linux中的三类角色
既然权限限制的是角色,那么在Linux系统中,文件相关的角色有哪些呢?
Linux为每个文件定义了三类访问者:
| 角色 | 英文 | 缩写 | 说明 |
|---|---|---|---|
| 拥有者 | User | u | 文件的创建者 |
| 所属组 | Group | g | 文件拥有者所在的组 |
| 其他人 | Others | o | 除了拥有者和所属组之外的所有用户 |

3.3 文件的三类权限
除了角色,权限系统还需要定义"能做什么"。Linux文件有三种基本权限:
| 权限 | 字符 | 八进制值 | 对文件的含义 | 对目录的含义 |
|---|---|---|---|---|
| 读 | r | 4 | 读取文件内容 | 列出目录内容 |
| 写 | w | 2 | 修改文件内容 | 创建/删除目录中的文件 |
| 执行 | x | 1 | 执行文件(程序) | 进入目录 |
这里有一个重要的细节:目录的写权限意味着可以删除目录中的任何文件,无论该文件的所有者是谁! 这个看似"不合理"的设计实际上非常合理------就像有人把东西放在你家里,你当然有权把它扔出去。
四、解读ls -l输出
现在让我们来看一个实际的例子。执行ls -l命令,你会看到类似这样的输出:
bash
$ ls -l
drwxrwxr-x 3 root devteam 4096 Jan 11 15:01 project
-rw-rw-r-- 1 whb whb 220 Jan 11 14:22 hello.txt

让我们逐列解读:
第一列:文件类型和权限(10个字符)
- 第1个字符:文件类型(d=目录,-=普通文件,l=链接等)
- 第2-4个字符:拥有者权限(rwx)
- 第5-7个字符:所属组权限(rwx)
- 第8-10个字符:其他人权限(r-x)
第三列:文件拥有者
第四列:文件所属组
注意:为什么没有"others"列?因为others是"除了拥有者和所属组之外的所有人",这是一个动态计算的概念,不需要单独记录。
4.1 权限位的固定顺序
权限字符的位置是固定的,不会出现wrx或xrw这样的顺序:
- 第1位:r(读)或 -(无读权限)
- 第2位:w(写)或 -(无写权限)
- 第3位:x(执行)或 -(无执行权限)
例如,rw-表示可读可写不可执行,r-x表示可读可执行不可写。
五、为什么需要"所属组"?
很多初学者会有疑问:为什么文件需要同时拥有"拥有者"和"所属组"两个属性?拥有者不就够了吗?
让我们通过一个团队开发的场景来理解这个问题。
5.1 场景:公司内部的赛马机制
假设你和朋友张三加入了一家创业公司,公司只有一台Linux服务器。公司采用"赛马机制"------两个团队同时开发同一款产品,最后内部竞争,胜出团队的代码会被采用。
- 你被分配到团队A
- 张三被分配到团队B
你们各自在服务器上开发,代码文件都放在各自的目录中。
5.2 没有所属组的问题
假设没有"所属组"这个概念,每个文件只有"拥有者"和"others"两类权限。
你写了一个月的代码,文件拥有者是你自己。现在你想让团队A的组长review你的代码。为了让组长能看你的代码,你必须开放"others"的读权限。
但问题是:一旦开放了others的读权限,团队B的张三也能看到你的代码了! 这显然是你不希望看到的。
5.3 所属组的解决方案
有了"所属组"的概念,问题就迎刃而解了:
- 管理员创建一个组
teamA,把你和组长都加入这个组 - 你的代码文件设置拥有者为"你",所属组为
teamA - 权限设置为:拥有者
rwx,所属组r-x,others---
这样,你和组长(同属teamA)都能读写文件,而张三(属于teamB,对文件来说是others)没有任何权限。
所属组的本质:在Linux系统中进行团队开发时,可以将同组人"拉到一个群里",统一进行权限管理。
六、修改文件权限:chmod命令
了解了权限的概念后,我们来看看如何修改权限。Linux提供了chmod命令来修改文件的权限属性。
6.1 字符表示法
使用u(拥有者)、g(所属组)、o(其他人)、a(所有人)配合+(添加)、-(移除)、=(设置)来修改权限:
bash
# 给拥有者添加执行权限
chmod u+x hello.txt
# 移除拥有者的读和写权限
chmod u-rw hello.txt
# 给所属组添加所有权限
chmod g+rwx hello.txt
# 移除其他人的读权限
chmod o-r hello.txt
# 给所有人添加写权限
chmod a+w hello.txt
# 设置所有人的权限为只读
chmod a=r hello.txt
# 组合操作:给拥有者添加执行权限,给其他人移除写权限
chmod u+x,o-w hello.txt
6.2 八进制表示法
字符法虽然直观,但写起来比较冗长。更常用的方法是八进制表示法。
每个权限位可以用一个二进制位表示:
- r = 4(二进制100)
- w = 2(二进制010)
- x = 1(二进制001)
三个权限组合起来,取值范围是0-7:
| 权限 | 二进制 | 八进制 |
|---|---|---|
| --- | 000 | 0 |
| --x | 001 | 1 |
| -w- | 010 | 2 |
| -wx | 011 | 3 |
| r-- | 100 | 4 |
| r-x | 101 | 5 |
| rw- | 110 | 6 |
| rwx | 111 | 7 |

使用八进制表示法修改权限:
bash
# 设置权限为 rwxr-xr-x(所有者可读写执行,组和其他人可读可执行)
chmod 755 script.sh
# 设置权限为 rw-r--r--(所有者可读写,组和其他人只读)
chmod 644 document.txt
# 设置权限为 rw-------(只有所有者可读写,完全私有)
chmod 600 secret.key
# 移除所有权限
chmod 000 hello.txt
# 赋予所有权限
chmod 777 hello.txt
常用权限组合记忆:
755:脚本文件的常用权限644:普通文档的常用权限600:私钥、密码文件等敏感数据777:开放所有权限(慎用!)
七、修改文件拥有者和所属组
7.1 chown:修改拥有者
bash
# 将hello.txt的拥有者改为pengge
sudo chown pengge hello.txt
注意:修改文件拥有者需要超级用户权限,因为这相当于"把东西给别人",需要征得对方的"同意"(通过sudo实现)。
7.2 chgrp:修改所属组
bash
# 将hello.txt的所属组改为devteam
sudo chgrp devteam hello.txt
7.3 同时修改拥有者和所属组
bash
# 同时修改拥有者和所属组
sudo chown pengge:devteam hello.txt
# 只修改所属组(冒号前为空)
sudo chown :devteam hello.txt
八、关键概念深入理解
8.1 身份匹配只进行一次
Linux权限检查有一个重要原则:身份匹配只进行一次,一旦匹配成功就不再继续检查。

让我们通过一个例子来理解:
假设有一个文件hello.txt,权限设置为:
- 拥有者(root):
---(无任何权限) - 所属组(devteam):
rwx(所有权限) - 其他人:
---(无任何权限)
现在,用户root(同时也是devteam组的成员)想读取这个文件。
你可能会想:虽然root作为拥有者没有权限,但他也是所属组成员,应该能读吧?
答案是:不能!
Linux的权限检查流程是:
- 检查用户是否是拥有者?是 → 使用拥有者权限
---→ 拒绝访问 - (不会执行)检查用户是否在所属组?
因为第一步已经匹配成功(用户确实是拥有者),系统就直接使用拥有者的权限,不会再检查所属组权限了。
要验证这一点,可以把文件的拥有者改成其他人,此时root就变成了"其他人",但由于他同时在devteam组,就会匹配到组的权限。
8.2 可执行权限的本质
很多初学者对"可执行权限"有误解。让我们澄清一下:
具有可执行权限 ≠ 文件可以被执行
可执行权限(x)只是表示"你被允许执行这个文件",但文件本身必须真的是一个可执行程序才能运行。
举个例子:
- 一个文本文件,即使给了x权限,也无法执行,因为它不是可执行程序
- 一个编译好的二进制程序,如果没有x权限,也无法执行(权限被拒绝)
正确的理解:
- x权限 = "你可以尝试执行这个文件"
- 文件能执行 = "x权限 + 文件本身是有效的可执行程序"
就像你有一把钥匙(x权限),但只有当它真的是对应门的钥匙时,才能打开门。
九、目录权限的特殊性
目录的权限与文件的权限含义不同,这是面试中的高频考点:

| 权限 | 对文件 | 对目录 |
|---|---|---|
| r | 读取文件内容 | 列出目录内容(ls命令) |
| w | 写入文件内容 | 创建/删除目录中的文件 |
| x | 执行文件 | 进入目录(cd命令) |
9.1 进入一个目录需要什么权限?
答案:需要x(执行)权限。
实验验证:
bash
# 创建一个测试目录
mkdir testdir
chmod 000 testdir # 移除所有权限
# 尝试进入目录
cd testdir # 失败!Permission denied
# 添加r权限
chmod u+r testdir
cd testdir # 仍然失败!
# 添加x权限
chmod u+x testdir
cd testdir # 成功!
9.2 目录的w权限:一个"危险"的权限
目录的w权限特别值得注意:只要用户对目录有w权限,就可以删除目录中的任何文件,无论该文件的所有者是谁!
这听起来有些"不合理",但从系统设计的角度是完全合理的:
- 文件存储在目录中,目录是文件的"容器"
- 既然你拥有这个目录(有w权限),你就有权决定目录里放什么、不放什么
- 这就像有人把东西放在你家里,你当然有权把它扔出去
十、文件类型总结
Linux中一切皆文件,文件类型通过ls -l输出的第一个字符标识:
| 字符 | 类型 | 说明 |
|---|---|---|
- |
普通文件 | 文本文件、二进制文件等 |
d |
目录 | 文件夹 |
l |
符号链接 | 类似Windows的快捷方式 |
b |
块设备文件 | 硬盘、光驱等 |
c |
字符设备文件 | 键盘、鼠标、显示器等 |
p |
管道文件 | 进程间通信 |
s |
套接字文件 | 网络通信 |
其中,-、d、l是最常见的三种类型。
十一、总结
通过本文的学习,我们深入理解了Linux权限管理的方方面面:
-
sudo白名单机制 :
/etc/sudoers文件控制谁能使用sudo,确保权限提升的可追溯性 -
权限的本质:权限 = 角色 + 属性,权限限制的是角色而非具体的人
-
三类角色:拥有者(u)、所属组(g)、其他人(o)
-
三种权限:读(r/4)、写(w/2)、执行(x/1)
-
修改权限:chmod命令支持字符法和八进制法两种表示方式
-
修改拥有者/组:chown和chgrp命令,需要sudo权限
-
身份匹配原则:只匹配一次,一旦匹配成功就不再继续
-
可执行权限:x权限只是"允许执行",文件能执行还需要本身是有效程序
-
目录权限特殊性:r=列出内容,w=创建/删除文件,x=进入目录
-
文件类型 :
-普通文件、d目录、l链接等
掌握这些知识,你就具备了进行Linux系统管理和开发的基础能力。权限管理看似复杂,但只要理解了"角色+属性"的核心思想,一切就变得清晰起来。