【Linux05】Linux权限管理深度解析(二)



🎬 Doro在努力个人主页
🔥 个人专栏 : 《MySQL数据库基础语法》《数据结构》

⛺️严于律己,宽以待人


Linux权限管理深度解析:从sudo到文件权限的完整指南

上节课我们探讨了shell命令的运行原理,今天我们将深入Linux权限管理的核心------从sudo提权机制到文件权限的每一个细节。这不仅是面试的高频考点,更是日常开发和系统管理的必备技能。


文章目录


一、课前复习: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 权限位的固定顺序

权限字符的位置是固定的,不会出现wrxxrw这样的顺序:

  • 第1位:r(读)或 -(无读权限)
  • 第2位:w(写)或 -(无写权限)
  • 第3位:x(执行)或 -(无执行权限)

例如,rw-表示可读可写不可执行,r-x表示可读可执行不可写。


五、为什么需要"所属组"?

很多初学者会有疑问:为什么文件需要同时拥有"拥有者"和"所属组"两个属性?拥有者不就够了吗?

让我们通过一个团队开发的场景来理解这个问题。

5.1 场景:公司内部的赛马机制

假设你和朋友张三加入了一家创业公司,公司只有一台Linux服务器。公司采用"赛马机制"------两个团队同时开发同一款产品,最后内部竞争,胜出团队的代码会被采用。

  • 你被分配到团队A
  • 张三被分配到团队B

你们各自在服务器上开发,代码文件都放在各自的目录中。

5.2 没有所属组的问题

假设没有"所属组"这个概念,每个文件只有"拥有者"和"others"两类权限。

你写了一个月的代码,文件拥有者是你自己。现在你想让团队A的组长review你的代码。为了让组长能看你的代码,你必须开放"others"的读权限。

但问题是:一旦开放了others的读权限,团队B的张三也能看到你的代码了! 这显然是你不希望看到的。

5.3 所属组的解决方案

有了"所属组"的概念,问题就迎刃而解了:

  1. 管理员创建一个组teamA,把你和组长都加入这个组
  2. 你的代码文件设置拥有者为"你",所属组为teamA
  3. 权限设置为:拥有者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的权限检查流程是:

  1. 检查用户是否是拥有者? → 使用拥有者权限---拒绝访问
  2. (不会执行)检查用户是否在所属组?

因为第一步已经匹配成功(用户确实是拥有者),系统就直接使用拥有者的权限,不会再检查所属组权限了。

要验证这一点,可以把文件的拥有者改成其他人,此时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 套接字文件 网络通信

其中,-dl是最常见的三种类型。


十一、总结

通过本文的学习,我们深入理解了Linux权限管理的方方面面:

  1. sudo白名单机制/etc/sudoers文件控制谁能使用sudo,确保权限提升的可追溯性

  2. 权限的本质:权限 = 角色 + 属性,权限限制的是角色而非具体的人

  3. 三类角色:拥有者(u)、所属组(g)、其他人(o)

  4. 三种权限:读(r/4)、写(w/2)、执行(x/1)

  5. 修改权限:chmod命令支持字符法和八进制法两种表示方式

  6. 修改拥有者/组:chown和chgrp命令,需要sudo权限

  7. 身份匹配原则:只匹配一次,一旦匹配成功就不再继续

  8. 可执行权限:x权限只是"允许执行",文件能执行还需要本身是有效程序

  9. 目录权限特殊性:r=列出内容,w=创建/删除文件,x=进入目录

  10. 文件类型-普通文件、d目录、l链接等

掌握这些知识,你就具备了进行Linux系统管理和开发的基础能力。权限管理看似复杂,但只要理解了"角色+属性"的核心思想,一切就变得清晰起来。


相关推荐
鱼跃鹰飞2 小时前
Leetcode:97.交错字符串
linux·服务器·leetcode
Gofarlic_oms12 小时前
通过Kisssoft API接口实现许可证管理自动化集成
大数据·运维·人工智能·分布式·架构·自动化
Suchadar2 小时前
Docker基础命令(二)——数据卷管理端口映射与容器互联
运维·docker·容器
firstacui3 小时前
Docker容器网络管理与容器数据卷管理
运维·docker·容器
Doro再努力3 小时前
【Linux操作系统07】包管理器与Vim编辑器:从理论到实践的全面解析
linux·编辑器·vim
XRJ040618xrj3 小时前
Nginx下构建PC站点
服务器·前端·nginx
m0_737302583 小时前
云服务器深度解析:技术内核、应用场景与上云避坑指南
服务器
Coder个人博客4 小时前
Linux6.19-ARM64 mm mmap子模块深入分析
大数据·linux·安全·车载系统·系统架构·系统安全·鸿蒙系统
江畔何人初4 小时前
/etc/profile,.profile,.bashrc三者区分
linux·运维·云原生