目录
场景:查看需要 root 权限的文件(如 /etc/shadow)
步骤 6(可选):修复问题——使用粘滞位(Sticky Bit)
3、仅有可执行权限的情况(如果目录有 -x 权限但无 -r 权限)
一、Shell命令及其运行原理
1、什么是Shell?
Linux严格意义上是一个操作系统内核(kernel),但普通用户通常不能直接使用kernel,而是通过kernel的"外壳"程序——Shell来与kernel进行交互。
2、为什么不能直接使用kernel?
从技术角度来看,直接操作kernel存在以下问题:
需要极高的技术门槛
容易因误操作导致系统不稳定
缺乏用户友好的交互方式
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 通过以下方式保证系统的稳定运行:
子进程处理模型
每当执行命令时,Shell 会创建独立的子进程来处理命令行解释工作
这种设计确保主 Shell 进程不受任何命令执行的影响
故障隔离机制
子进程的异常或意外终止不会影响父进程 Shell
即使某个命令执行失败,Shell 环境仍能保持稳定运行
2、Windows 系统的类似设计
Windows 采用相同的进程隔离理念:
应用程序独立运行:每个启动的程序(如微信、QQ)都作为独立子进程运行
故障隔离表现:
当某个应用程序(如QQ)出现卡死或崩溃时
其他应用程序和系统主进程仍可正常运行
用户可继续操作系统或其他程序不受影响
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系统中有两种主要用户类型:
超级用户(root)
拥有系统最高权限,可以执行任何操作
不受常规权限限制
命令提示符为
#
普通用户
权限受到限制,只能执行授权范围内的操作
命令提示符为
$
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这个普通用户并没有在提权配置文件里面,所以非法了:
添加用户至信任列表
要将普通用户加入信任列表:
- 首先切换至超级用户身份(仅超级用户有此权限)
- 使用vim编辑器修改
sudoers
配置文件[root@hcss-ecs-1c15 ~]# vim /etc/sudoers
- 添加相应用户后,该用户即可使用
sudo
命令提升指令权限 - 格式:
接受权限的用户 登陆的主机 = (执行命令的用户) 命令
这次我们就可以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 = 7rw-
= 4+2+0 = 6r-x
= 4+0+1 = 5r--
= 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
因此实际创建的文件和目录权限值需要进行换算才能确定。具体步骤如下:
- 将掩码的后三位八进制数转换为二进制
- 对二进制值进行按位取反
- 将新建文件/目录的默认权限值与取反后的掩码值进行按位与操作
- 最终结果即为实际创建的文件/目录权限值
5、file 命令
功能:辨识文件类型
语法:file [选项] 文件或目录...
常用选项
-c
:详细显示指令执行过程,便于排错-z
:尝试解读压缩文件的内容
七、目录的权限
对于文件而言,其可读、可写、可执行的属性含义众所周知。那么对于目录来说,这些权限又分别代表什么操作呢?
- 可读权限:若无目录可读权限,用户将无法通过
ls
命令查看目录内容 - 可写权限:若无目录可写权限,用户将无法在目录中创建或删除文件
- 可执行权限:若无目录可执行权限,用户将无法使用
cd
命令进入该目录
权限问题的发现
从上述规则可以看出:只要用户对目录具有写权限,就可以删除该目录中的文件,无论该用户是否拥有该文件的写权限。
这可能导致不合理的情况:例如,用户A创建的文件可以被用户B删除,即使文件本身没有赋予用户B写权限。
实验验证
步骤 1:创建一个测试目录
步骤 2:设置目录权限(开放写权限)
步骤 3:创建一个受保护的文件(仅所有者可读写)
步骤 4:切换到另一个用户(或新终端模拟另一个用户)
步骤 5:测试文件权限
尝试读取文件(应该失败,因为无读取权限):
尝试删除文件(应该成功,因为目录可写):
为了解决这个不合理的问题,Linux引入了粘滞位的概念。
八、粘滞位
粘滞位的作用说明:
当一个目录被设置粘滞位(使用chmod +t
)后,该目录下的文件只能由以下用户删除:
超级管理员(root)
该目录的所有者
该文件的所有者
我们现在使用粘滞位来解决上面的权限问题:
步骤 6(可选):修复问题——使用粘滞位(Sticky Bit)
回到原用户(按 Ctrl+D
或 exit
退出 nobody
会话):
当用户为某个目录设置粘滞位时,该目录权限值的最后一位会变成字母"t"。 此时,即使其他用户拥有该目录的写入权限,也无法删除该目录中的文件。
再次以另一个普通用户hjj尝试删除:
需要注意的是:虽然目录设置了粘滞位,但如果用户拥有该目录的写入权限,仍然可以在该目录下创建新文件和删除这个新文件。
九、关于目录权限的总结(重要)
1、目录的可执行权限(x)
表示用户是否可以在该目录下执行命令。这是目录权限中最关键的一项。
2、缺少可执行权限的情况(如果目录没有 -x
权限)
用户无法对该目录执行任何操作(包括
cd
进入目录)。即使目录有
-r
读权限,也无法进入或读取目录内容。
(这是一个常见的误区:许多人误以为拥有读权限即可进入目录并读取文件。)
3、仅有可执行权限的情况(如果目录有 -x
权限但无 -r
权限)
- 但由于缺少读权限,即使执行
ls
命令,也无法查看目录下的文件列表。 - 用户可以
cd
进入目录并执行命令。
我们来验证一下:
1. 创建测试环境
2. 测试不同权限组合
我们测试三种典型情况:
无执行权限 (
-x
)仅有执行权限 (
--x
)正常权限 (
r-x
或rwx
)
测试 1:目录无执行权限 (-x
)
设置权限(保留读权限)
测试操作
结论:
没有 x
权限时,所有操作(包括 cd
、ls
、读取文件)均失败,即使有 r
权限。
测试 2:目录仅有执行权限 (--x
)
设置权限
测试操作
结论:
仅有 x
权限时:
可以
cd
进入目录可以访问已知具体文件名(需路径正确)
不能列出目录内容(无
r
权限)不能修改目录(无
w
权限)