Linux安全基石:Shell运行原理与权限管理系统解读

发布于:2025-06-24 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

一、Shell命令及其运行原理

1、什么是Shell?

2、为什么不能直接使用kernel?

3、Shell的定义与功能

4、Shell与GUI的类比

二、Shell 运行原理与进程隔离机制

1、Shell 的运行机制

子进程处理模型

故障隔离机制

2、Windows 系统的类似设计

3、系统设计优势

4、任务管理器

1. 快捷键组合

2. 通过开始菜单或搜索

3. 运行命令

4. 文件资源管理器

5. 任务栏右键菜单

6. 通过命令提示符或 PowerShell

扩展补充知识:

任务管理器的作用

各版本适用性

三、Linux权限管理:用户与权限基础

1、Linux用户分类

超级用户(root)

普通用户

2、用户切换命令

su 命令

使用示例

从root切换到普通用户

从普通用户切换到root

3、提升当前指令权限的方法

仅提升当前指令权限

基础示例:临时提升单条指令权限

场景:查看需要 root 权限的文件(如 /etc/shadow)

添加用户至信任列表

四、Linux权限管理

1、文件访问者的分类(人)

2、文件类型和访问权限(事物属性)

文件类型

基本权限

五、文件权限值的表示方法

1、字符表示法 (Symbolic Notation)

2、八进制数值表示法 (Octal Notation)

六、 文件访问权限设置方法

1、chmod 命令

常用选项

权限设置格式

用户表示符+/-/=权限字符

三位八进制数字表示法

2、chown 命令

3、chgrp 命令

常用选项

4、umask 命令

默认权限

5、file 命令

常用选项

七、目录的权限

权限问题的发现

实验验证

步骤 1:创建一个测试目录

步骤 2:设置目录权限(开放写权限)

步骤 3:创建一个受保护的文件(仅所有者可读写)

步骤 4:切换到另一个用户(或新终端模拟另一个用户)

步骤 5:测试文件权限

八、粘滞位

步骤 6(可选):修复问题——使用粘滞位(Sticky Bit)

九、关于目录权限的总结(重要)

1、目录的可执行权限(x)

2、缺少可执行权限的情况(如果目录没有 -x 权限)

3、仅有可执行权限的情况(如果目录有 -x 权限但无 -r 权限)

1. 创建测试环境

2. 测试不同权限组合

测试 1:目录无执行权限 (-x)

设置权限(保留读权限)

测试 2:目录仅有执行权限 (--x)

设置权限


一、Shell命令及其运行原理

1、什么是Shell?

        Linux严格意义上是一个操作系统内核(kernel),但普通用户通常不能直接使用kernel,而是通过kernel的"外壳"程序——Shell来与kernel进行交互。

2、为什么不能直接使用kernel?

从技术角度来看,直接操作kernel存在以下问题:

  1. 需要极高的技术门槛

  2. 容易因误操作导致系统不稳定

  3. 缺乏用户友好的交互方式

3、Shell的定义与功能

Shell本质上是一个命令行解释器(command interpreter),主要功能包括:

  • 命令翻译:将用户的命令翻译成kernel能够理解的指令

  • 结果反馈:将kernel的处理结果翻译并呈现给用户

4、Shell与GUI的类比

        Windows采用图形化界面(GUI)作为主要交互方式,而Linux则以命令行界面为主。尽管这两种系统的交互形式存在差异,但它们的核心功能一致——都是为了方便用户操作系统。无论是图形化界面还是命令行界面,本质上都属于我们所说的"外壳程序"。

  • 在Windows中,用户不直接操作内核,而是通过图形界面(GUI)完成操作

    • 例如:通过双击D盘图标进入D盘

    • 或者通过点击应用程序图标来运行程序

在Linux系统中,Shell扮演着类似的角色:

  • 解析用户输入的指令

  • 将解析后的指令传递给Linux内核执行

  • 接收内核返回的结果并呈现给用户

        这种架构设计既保证了系统的安全性,又提供了灵活的操作方式,是Unix/Linux系统的重要特性之一。


二、Shell 运行原理与进程隔离机制

1、Shell 的运行机制

Shell 通过以下方式保证系统的稳定运行:

  1. 子进程处理模型

    • 每当执行命令时,Shell 会创建独立的子进程来处理命令行解释工作

    • 这种设计确保主 Shell 进程不受任何命令执行的影响

  2. 故障隔离机制

    • 子进程的异常或意外终止不会影响父进程 Shell

    • 即使某个命令执行失败,Shell 环境仍能保持稳定运行

2、Windows 系统的类似设计

Windows 采用相同的进程隔离理念:

  • 应用程序独立运行:每个启动的程序(如微信、QQ)都作为独立子进程运行

  • 故障隔离表现

    • 当某个应用程序(如QQ)出现卡死或崩溃时

    • 其他应用程序和系统主进程仍可正常运行

    • 用户可继续操作系统或其他程序不受影响

3、系统设计优势

这种进程隔离机制具有以下优点:

  1. 增强系统稳定性:局部故障不会导致整个系统崩溃

  2. 提高安全性:限制单个进程的影响范围

  3. 改善用户体验:允许用户继续工作而不受个别程序故障影响

技术提示:现代操作系统普遍采用这种设计理念,无论是Linux的Shell环境还是Windows的图形界面,都通过进程隔离(后面的进程部分会讲解)来确保系统核心的稳定性。

4、任务管理器

在 Windows 系统中,可以通过以下几种方式打开任务管理器(Task Manager):

1. 快捷键组合

  • Ctrl + Shift + Esc:直接打开任务管理器(最快捷方式)。

  • Ctrl + Alt + Delete → 选择 “任务管理器”(适用于所有 Windows 版本)。

2. 通过开始菜单或搜索

  • 右键点击开始按钮(或按 Win + X)→ 选择 “任务管理器”

  • 按 Win + S 打开搜索 → 输入 “任务管理器” → 点击结果。

3. 运行命令

  • 按 Win + R 打开“运行”窗口 → 输入 taskmgr → 回车。

4. 文件资源管理器

  • 打开 文件资源管理器(Win + E)→ 地址栏输入 taskmgr → 回车。

5. 任务栏右键菜单

  • 右键点击任务栏空白处 → 选择 “任务管理器”

6. 通过命令提示符或 PowerShell

  • 打开 cmd → 输入 taskmgr → 回车。

  • 打开PowerShell → 输入 taskmgr → 回车。 

扩展补充知识:

        在 Windows 中,命令提示符(CMD) 和 PowerShell 都是命令行外壳(Shell),但它们的设计和功能有所不同:

命令提示符(CMD)

  • 传统外壳,基于早期的 MS-DOS

  • 主要执行 .bat 或 .cmd 批处理脚本

  • 命令语法较简单,但功能有限。

  • 适用于简单的系统管理任务。

PowerShell

  • 更强大的现代外壳,由 Microsoft 开发。

  • 支持 面向对象的脚本(.ps1,比 CMD 更灵活。

  • 可以调用 .NET Framework,适用于自动化管理和高级任务。

  • 默认集成在 Windows 10/11 中,并逐步取代 CMD。

哪个是 Windows 的默认外壳?

  • 在 Windows 10/11 中:

    • 按 Win + X 时,默认显示 PowerShell(可手动切换回 CMD)。

    • 在 任务管理器(Ctrl+Shift+Esc)中,默认新建任务使用 PowerShell(除非手动更改)。

  • 但 CMD 仍然保留,用于兼容旧脚本。 

任务管理器的作用

  • 查看/结束进程、监控性能、管理启动项、查看用户活动等。

各版本适用性

  • Windows 10/11:以上方法均适用。

  • Windows 7/8:部分快捷键和菜单位置略有不同,但 Ctrl+Shift+Esc 和 Ctrl+Alt+Delete 通用。


三、Linux权限管理:用户与权限基础

1、Linux用户分类

Linux系统中有两种主要用户类型:

  1. 超级用户(root)

    • 拥有系统最高权限,可以执行任何操作

    • 不受常规权限限制

    • 命令提示符为 #

  2. 普通用户

    • 权限受到限制,只能执行授权范围内的操作

    • 命令提示符为 $

2、用户切换命令

su 命令

语法su [用户名]
功能:切换当前用户身份

使用示例

  • 从root切换到普通用户

    su [用户名]

1.无需输入密码(root切换至其他用户时拥有特权)

2. 若初始时你是普通用户,但是你切换到了root超级用户去干了某件事后,你想要切回来普通用户,你可以直接输入exit指令,即退出当前用户,进入上一次的用户身份:

  • 从普通用户切换到root

    su root

    或简写为:

    su
    • 系统会提示输入root用户的密码(输入的密码默认不显示)

    • 成功验证后获得root权限

        若初始时你是root超级用户,但是你切换到了普通用户去干了某件事后,你想要切回来root,你可以直接输入exit指令,即退出当前用户,进入上一次的用户身份:

注意频繁使用root权限存在安全风险,建议日常操作使用普通用户账户,仅在必要时切换至root。

注意:

1)切换为root账号时,可省略指令中的"root"参数,因为系统仅存在一个root账号。

2)此指令同样适用于普通用户之间的切换,只需输入目标用户的账号和密码。

3)使用Ctrl+D快捷键可快速返回上一个用户。

3、提升当前指令权限的方法

仅提升当前指令权限

若只需提升单条指令的权限,无需切换至超级用户。

语法sudo 指令
功能:临时提升当前执行的指令权限

示例场景
        以普通用户身份修改其他用户的密码时,使用该命令后可能出现提示信息,表示您未被超级用户(root)授权执行该操作。由于安全考虑,普通用户无权随意修改他人密码,因此需要先获得授权。

基础示例:临时提升单条指令权限

场景:查看需要 root 权限的文件(如 /etc/shadow

1、普通用户直接尝试查看会报错:

2、使用sudo临时提权 

  • 结果

    • 若 hmz 已在 sudoers 信任列表中,输入正确密码后可查看文件内容:

    • 若未授权,会提示 hmz is not in the sudoers file.。由于我现在只有一个普通用户,所以我就用超级用户另开一个新普通用户来验证这个结果:

        我们现在切换成hjj这个普通用户,然后进行sudo操作,我们会发现,它让我们输入hjj的密码,输入后提示hjj这个普通用户并没有在提权配置文件里面,所以非法了: 

添加用户至信任列表

要将普通用户加入信任列表:

  1. 首先切换至超级用户身份(仅超级用户有此权限)
  2. 使用vim编辑器修改sudoers配置文件
    [root@hcss-ecs-1c15 ~]# vim /etc/sudoers

  3. 添加相应用户后,该用户即可使用sudo命令提升指令权限
  4. 格式
    接受权限的用户 登陆的主机 = (执行命令的用户) 命令

这次我们就可以sudo提权了: 


四、Linux权限管理

1、文件访问者的分类(人)

  • 文件所有者 (User, u)

    • 文件和文件目录的拥有者

    • 类比:中国公民(具有最高管理权限)

  • 所属组用户 (Group, g)

    • 文件所有者所在组的其他用户

    • 类比:家庭成员(共享部分权限)

  • 其他用户 (Others, o)

    • 既不是所有者也不在所属组的用户

    • 类比:外国人(权限受限)

注意:

1)对于文件而言,其权限管理涉及三个主体:文件拥有者(由超级用户root或普通用户担任)、所属组和其他用户(other)。

2)在Linux系统中,所有用户都必须属于至少一个用户组。如果用户单独成组,则该组名与用户名相同。

为什么需要所属组这个概念?

        我们用一个实际案例来说明:假设某公司有两个开发团队(A组和B组)在同一台Linux服务器上并行开发同一项目,你是A组成员。

若没有所属组机制,你创建的文件只有两种权限选择:

  • 仅自己(拥有者)可见
  • 所有人(other)可见

        但实际需求往往是希望文件对本人和同组成员可见,而对其他人不可见。所属组的概念正好解决了这个问题,允许你设置"拥有者和所属组可见,其他人不可见"的权限。这种机制为团队协作提供了灵活的权限管理方案。

查看文件或目录的拥有者和所属组,可以使用ll命令:

注:other是指既不是文件拥有者,也不属于文件所属组的其他所有用户。

2、文件类型和访问权限(事物属性)

        在讨论具体对象的权限时,还需要考虑对象本身的属性。以文件为例,我们需要关注其文件类型以及是否具备读、写和执行权限。

        通过执行ll命令,可以查看到一串10位的字符,这组字符完整地描述了文件的类型和属性。其中第一位字符就明确标识了该文件的类型:

文件类型

符号 类型 说明
d 目录文件 文件夹
- 普通文件 常规文件
l 软链接 类似Windows的快捷方式
b 块设备文件 如硬盘、光驱等
p 管道文件 进程间通信使用
c 字符设备文件 如屏幕等串口设备
s 套接字文件 网络通信使用

注意: 在Linux当中,文件类型与文件后缀无关。       

        文件属性由剩下的9个字符表示,每3个字符为一组,分别表示文件所有者、所属组和其他用户的权限。总的来看的话,具体分为四列:第一列显示文件类型,第二列是所有者权限,第三列为所属组权限,第四列为其他用户权限。

        每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个代表是否具有可写属性,第三个代表是否具有可执行属性。若是具有可读属性,则第一个位置的字符为r;若是具有可写属性,则第二个位置的字符为w;若是具有可执行属性,则第三个位置的字符为x。若某一位置为字符 - ,则说明不具有对应位置的属性。

让我们举个例子说明一下该文件的类型及权限设置:

        其中我们观察到红色部分框内部分:text.txt 是一个普通文件,其所有者和所属组都拥有读写权限,而其他用户仅具备读取权限。

基本权限

权限 符号 数字 对文件的作用 对目录的作用
r 4 可读取文件内容 可浏览目录内容
w 2 可修改文件内容 可在目录内创建/删除文件
执行 x 1 可执行文件(如脚本/程序) 可进入该目录
- 0 无相应权限 无相应权限

注:权限组合使用,如rwx=7(4+2+1),rw-=6(4+2+0),r-x=5(4+0+1)等


五、文件权限值的表示方法

Linux系统中,文件权限可以通过两种方式表示:

1、字符表示法 (Symbolic Notation)

使用 ll 命令显示文件权限时,采用的是字符表示法:

使用字母组合表示权限,格式为:
[文件类型][所有者权限][组权限][其他用户权限]

字符表示法 说明
r - - 仅可读
- w - 仅可写
- - x 仅可执行
r w - 可读可写
r - x 可读可执行
- w x 可写可执行
r w x 可读可写可执行
- - - 无权限

示例:

  • -rwxr-xr--
    表示:普通文件,所有者有读/写/执行权限,组用户有读/执行权限,其他用户只有读权限

  • drwxr-x---
    表示:目录文件,所有者有全部权限,组用户有读和执行权限,其他用户无任何权限

2、八进制数值表示法 (Octal Notation)

        权限可以用3位八进制数字表示,每位数字分别对应所有者、组和其他用户的权限设置。字符权限表示法中,每个字符位置只有两种状态(允许或禁止)。因此可以将三个权限字符转换为三个二进制位,进而合并成一个八进制数字来表示:

字符表示法 二进制 八进制数值表示法 说明
r - - 100 4 仅可读
- w - 010 2 仅可写
- - x 001 1 仅可执行
r w - 110 6 可读可写
r - x 101 5 可读可执行
- w x 011 3 可写可执行
r w x 111 7 可读可写可执行
- - - 000 0 无权限

权限换算表:

  • 读(r) = 4

  • 写(w) = 2

  • 执行(x) = 1

  • 无权限(-) = 0

组合计算方式:

  • rwx = 4+2+1 = 7

  • rw- = 4+2+0 = 6

  • r-x = 4+0+1 = 5

  • r-- = 4+0+0 = 4

常见权限示例:

  • 755 → rwxr-xr-x

  • 644 → rw-r--r--

  • 777 → rwxrwxrwx (通常不建议使用)

  • 600 → rw-------


六、 文件访问权限设置方法

1、chmod 命令

功能:设置文件的访问权限
格式chmod [参数] 权限 文件名

常用选项

  • -R:递归修改目录文件的权限

  • 注意:只有文件拥有者和root用户才能修改文件权限

权限设置格式

用户表示符+/-/=权限字符
  • +:向权限范围增加权限

  • -:向权限范围取消权限

  • =:向权限范围赋予权限

用户符号

  • u:拥有者

  • g:拥有者同组用户

  • o:其他用户

  • a:所有用户

实例

原来的text.txt文件访问权限如下:

现在我们尝试使用chmod 命令设置文件的访问权限,如下:

1、向拥有者权限添加可执行权限:

        可以看到text.txt已经变成了绿色。在Linux终端中,绿色的文件名通常表示该文件是一个可执行文件或具有可执行权限x权限)。

关于文件命名颜色的补充:

  • 颜色规则

    • 绿色:可执行文件(如脚本、二进制程序,或任何带 x 权限的文件)。

    • 白色/灰色:普通文件(如文本文件,默认无 x 权限)。

    • 其他颜色:目录(蓝色)、符号链接(青色)等。

2、向拥有者同组用户权限取消可读权限: 

3、赋给other权限,这个权限跟user一样: 

4、若要同时设置不同类用户的访问权限,则需用逗号隔开: 

三位八进制数字表示法

实例

2、chown 命令

功能:修改文件的拥有者

格式chown [参数] 用户名 文件名

常用选项: -R 递归修改目录文件的拥有者。

实例

1、修改文件所有者需使用root账户操作。普通用户需提升权限后方可执行此操作(注意),如下,成功将文件所有者改为root:

2、此外,可通过chown命令同时更改文件所有者和所属组,只需在用户名和组名间用冒号分隔即可:

3、chgrp 命令

功能:修改文件或目录的所属组
格式chgrp [参数] 用户组名 文件名

常用选项

  • -R:递归修改文件或目录的所属组

实例

4、umask 命令

功能

  • 查看或修改文件掩码

  • 控制新建文件和目录的默认权限

我们先查看新建的文件和目录,它们都有自己默认的权限:

默认权限

  • 新建文件默认权限:0666

  • 新建目录默认权限:0777

  • 第一位数字的0代表特殊权限,此处无需深入探讨。后三位数字则是用八进制表示的权限值,我们将它们转换为字符形式。

        但在实际应用中,创建文件和目录时的权限值往往与我们计算的预期值不同,这主要是由于umask机制的影响。系统默认权限(mask)会受到umask值的限制。

实际权限计算
实际权限 = 默认权限(mask) & 默认掩码值(~umask)

格式:umask 权限值

说明

  • 超级用户默认掩码值:0022

  • 普通用户默认掩码值:0002

因此实际创建的文件和目录权限值需要进行换算才能确定。具体步骤如下:

  1. 将掩码的后三位八进制数转换为二进制
  2. 对二进制值进行按位取反
  3. 将新建文件/目录的默认权限值与取反后的掩码值进行按位与操作
  4. 最终结果即为实际创建的文件/目录权限值

5、file 命令

功能:辨识文件类型
语法file [选项] 文件或目录...

常用选项

  • -c:详细显示指令执行过程,便于排错

  • -z:尝试解读压缩文件的内容


七、目录的权限

        对于文件而言,其可读、可写、可执行的属性含义众所周知。那么对于目录来说,这些权限又分别代表什么操作呢?

  • 可读权限:若无目录可读权限,用户将无法通过ls命令查看目录内容
  • 可写权限:若无目录可写权限,用户将无法在目录中创建或删除文件
  • 可执行权限:若无目录可执行权限,用户将无法使用cd命令进入该目录

权限问题的发现

        从上述规则可以看出:只要用户对目录具有写权限,就可以删除该目录中的文件,无论该用户是否拥有该文件的写权限
        这可能导致不合理的情况:例如,用户A创建的文件可以被用户B删除,即使文件本身没有赋予用户B写权限。

实验验证

步骤 1:创建一个测试目录

步骤 2:设置目录权限(开放写权限)

步骤 3:创建一个受保护的文件(仅所有者可读写)

步骤 4:切换到另一个用户(或新终端模拟另一个用户)

步骤 5:测试文件权限

尝试读取文件(应该失败,因为无读取权限):

尝试删除文件(应该成功,因为目录可写):

为了解决这个不合理的问题,Linux引入了粘滞位的概念。


八、粘滞位

粘滞位的作用说明:
当一个目录被设置粘滞位(使用chmod +t)后,该目录下的文件只能由以下用户删除:

  1. 超级管理员(root)

  2. 该目录的所有者

  3. 该文件的所有者

我们现在使用粘滞位来解决上面的权限问题:

步骤 6(可选):修复问题——使用粘滞位(Sticky Bit)

回到原用户(按 Ctrl+D 或 exit 退出 nobody 会话):

        当用户为某个目录设置粘滞位时,该目录权限值的最后一位会变成字母"t"。 此时,即使其他用户拥有该目录的写入权限,也无法删除该目录中的文件。 

再次以另一个普通用户hjj尝试删除:

        需要注意的是:虽然目录设置了粘滞位,但如果用户拥有该目录的写入权限,仍然可以在该目录下创建新文件和删除这个新文件。


九、关于目录权限的总结(重要)

1、目录的可执行权限(x)

表示用户是否可以在该目录下执行命令。这是目录权限中最关键的一项。

2缺少可执行权限的情况(如果目录没有 -x 权限)

  • 用户无法对该目录执行任何操作(包括 cd 进入目录)。

  • 即使目录有 -r 读权限,也无法进入或读取目录内容。
    (这是一个常见的误区:许多人误以为拥有读权限即可进入目录并读取文件。)

3、仅有可执行权限的情况(如果目录有 -x 权限但无 -r 权限)

  • 但由于缺少读权限,即使执行 ls 命令,也无法查看目录下的文件列表。
  • 用户可以 cd 进入目录并执行命令。

我们来验证一下:

1. 创建测试环境

2. 测试不同权限组合

我们测试三种典型情况:

  1. 无执行权限 (-x)

  2. 仅有执行权限 (--x)

  3. 正常权限 (r-x 或 rwx)


测试 1:目录无执行权限 (-x)

设置权限(保留读权限)

测试操作

结论
没有 x 权限时,所有操作(包括 cdls、读取文件)均失败,即使有 r 权限。


测试 2:目录仅有执行权限 (--x)

设置权限

测试操作

结论
仅有 x 权限时:

  • 可以 cd 进入目录

  • 可以访问已知具体文件名(需路径正确)

  • 不能列出目录内容(无 r 权限)

  • 不能修改目录(无 w 权限)


网站公告

今日签到

点亮在社区的每一天
去签到