【Linux系统】Linux权限 | Shell命令以及运行原理
1. Shell命令以及运行原理
一、Shell命令的运行原理(前期理解)
-
Shell的本质
Shell是命令行解释器(Command Interpreter),核心功能是翻译用户指令:- 将用户输入的命令翻译为操作系统内核(Kernel)能理解的指令 。
- 将Kernel的处理结果翻译为用户可读的反馈(如终端输出)。
-
运行流程简化模型
用户输入命令 → Shell解析命令 → 调用Kernel执行 → Kernel返回结果 → Shell输出结果 。
关键点:即使未学习进程知识,可类比为**“翻译官”角色**:用户通过翻译官(Shell)与外国人(Kernel)沟通,避免直接交流障碍 。
二、为什么不能直接使用Kernel?
-
安全性与稳定性
Kernel是操作系统的核心,直接操作可能导致:- 系统崩溃:用户误操作(如删除关键文件)会破坏系统稳定性 。
- 非法访问:未授权操作可能引发安全漏洞(如越权访问硬件)。
-
易用性门槛
Kernel操作需深入理解系统底层(如内存管理、硬件驱动),对普通用户极不友好 。
例如:删除文件需直接操作磁盘数据结构,而Shell只需rm file.txt
。 -
设计哲学
操作系统通过Shell/GUI等“外壳程序”隔离用户与内核,实现分层保护(类似防火墙)。
三、对比Windows GUI与Linux Shell
维度 | Windows GUI | Linux Shell | 本质共性 |
---|---|---|---|
交互方式 | 图形界面(点击图标/菜单) | 命令行(输入文本指令) | 均为用户与内核的中间层 |
操作示例 | 双击D盘图标进入D盘 | 输入cd /mnt/d 进入D盘 | GUI将点击翻译为系统调用,Shell将文本翻译为系统调用 |
优势 | 直观易用,适合普通用户 | 高效灵活,适合自动化与高级操作 | 均保护内核并简化操作 |
核心结论:二者本质均为 用户与操作系统的“代理” ,GUI是图形化代理,Shell是文本化代理 。
四、通俗示例帮助理解
场景:餐厅点餐流程
- 用户:顾客(想吃饭的人)。
- Shell/GUI:服务员(接受用户指令并传达后厨)。
- Kernel:厨师(实际执行烹饪操作)。
举个通俗易懂的例子:
假设你去餐厅吃饭,内核就像是厨师,他负责准备食物(处理任务),而Shell就像是服务员,他接收你的点餐(命令),然后告诉厨师去做(调用内核功能),最后把食物(结果)端给你。你不需要直接和厨师交流,只需要和服务员交流就行。在Windows系统中,GUI就像是一个点餐机,你通过触摸屏幕选择食物,这也很方便,但相对而言没有服务员(Shell)那样灵活,可以处理更复杂的点餐需求。
流程对比
-
Linux Shell场景
- 顾客对服务员说:“要一份番茄炒蛋”(命令
cook egg_tomato
)。 - 服务员(Shell)翻译为后厨指令:“番茄200g+鸡蛋3个,大火翻炒3分钟”(Kernel指令)。
- 厨师(Kernel)完成后,服务员将菜品端给顾客(输出结果)。
- 顾客对服务员说:“要一份番茄炒蛋”(命令
-
Windows GUI场景
- 顾客点击菜单上的“番茄炒蛋”图片(图形化操作)。
- 服务员(GUI)将点击动作翻译为后厨指令(同Shell的翻译功能)。
- 厨师完成菜品后由服务员端上 。
为何不能直接找厨师?
- 顾客进厨房操作灶具(直接操作Kernel)可能导致:
- 烧伤自己(系统崩溃)。
- 干扰其他厨师工作(破坏多任务环境)。
- 服务员的存在保证了效率与安全(隔离用户与核心系统)。
总结
- Shell原理:用户指令的翻译官与传递者 。
- 禁用直接Kernel访问:防止误操作破坏系统,降低使用门槛 。
- Shell vs. GUI:前者以文本为媒介,后者以图形为媒介,但核心角色一致 。
- 学习建议:前期可将Shell理解为“系统操作指令的翻译器”,后续再深入进程、系统调用等机制 。
2. Linux权限
2.1 Linux权限的概念
🔐 Linux权限体系核心:两类用户与切换机制
Linux通过严格的用户权限管理保障系统安全,其权限体系围绕 两种用户类型 和 三类切换命令 构建,下面从概念到实操全面解析。
⚖️ 一、用户分类:权限的底层逻辑
用户类型 | 权限范围 | 命令提示符 | 创建方式 | 典型场景 |
---|---|---|---|---|
超级用户 (root) | 无限制(可修改系统文件、安装全局软件等) | # | 系统默认存在 | 系统配置、软件安装、权限分配 |
普通用户 | 受限(仅操作个人目录,禁止修改系统) | $ | useradd 或 adduser | 日常开发、文件编辑 |
关键差异:
- root用户UID=0,普通用户UID≥1000
- 普通用户操作受
/etc/sudoers
文件限制
🔁 二、用户切换:三大命令详解
1. su
命令(全切换)
su - [用户名] # 加载目标用户环境变量(推荐)
su [用户名] # 不加载环境变量,保留原工作目录
-
切换root:
$ su - # 或 su - root → 输入root密码 # 成功提示符变为 #
-
切换普通用户:
# su - alice # root切用户免密 $ su - bob # 普通用户互切换需输入目标用户密码
-
退出用户:
$ exit # 或 Ctrl+D 退回原用户
2. sudo
命令(临时提权)
sudo [命令] # 以root权限执行单条命令
- 前置条件:需在
/etc/sudoers
中授权 - 示例:
$ sudo apt install nginx # 普通用户安装软件
3. sudo -i
(切换root环境)
$ sudo -i # 直接进入root的HOME目录并加载环境变量
操作注意:
- 输入密码时终端无回显(不显示*号)
- 使用
su -
而非su
避免环境变量污染
🛠️ 三、场景化命令对比
需求场景 | 推荐命令 | 优势 |
---|---|---|
长期执行管理员任务 | su - → 执行任务 → exit | 环境隔离彻底 |
单次安装软件 | sudo apt install | 无需完全切换用户 |
调试其他用户环境 | su - bob | 完整加载目标用户配置 |
⚠️ 四、安全实践指南
-
最小权限原则
- 日常操作使用普通用户,避免误操作导致系统崩溃
-
sudoers精细授权
# 在/etc/sudoers添加: alice ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl # 仅允许执行apt和systemctl
-
切换后验证身份
$ whoami # 显示当前用户 $ id # 查看用户UID/GID
💎 总结
Linux权限体系通过用户隔离与精细切换实现安全与效率的平衡:
- 两类用户:root(#)掌握生杀大权,普通用户($)受限操作
- 三条通路:
su -
→ 完全环境切换sudo
→ 临时特权执行sudo -i
→ 快速进入root环境
- 安全铁律:日常用普通用户,特权操作后立即退出root!
示例:
# 1. 当前用户身份验证(root用户)
root@hcss-ecs-d90d:\~# whoami
root # 确认当前是root超级用户# 2. 切换到普通用户ltx(保留环境变量)
root@hcss-ecs-d90d:\~# su ltx # 3. 验证切换后用户身份
ltx@hcss-ecs-d90d:/root$ whoami
ltx # 当前已变为普通用户ltx# 4. 尝试列出/root目录内容(失败)
ltx@hcss-ecs-d90d:/root$ ls -a
ls: cannot open directory '.': Permission denied
# 原因:普通用户无权访问root的家目录(默认权限700)# 5. 返回当前用户(ltx)的家目录
ltx@hcss-ecs-d90d:/root$ cd \~ # 6. 列出ltx家目录内容(成功)
ltx@hcss-ecs-d90d:\~$ ls -a
. .. .bash_history .bash_logout .bashrc .profile
# 显示标准用户配置文件(用户对自己的家目录有完全权限)# 7. 退出当前shell环境(返回root用户)
ltx@hcss-ecs-d90d:\~$ exit
root@hcss-ecs-d90d:\~# # 提示符变回root# 8. 以root身份列出/root目录内容(成功)
root@hcss-ecs-d90d:\~# ls -a
. .. .bash_history .bashrc .cache config.yml file1.log file2.log file.txt .history .lesshst .local mydir mydir1 mydir2 private .profile snap .ssh team_shared test.txt .viminfo .Xauthority
# root可查看所有系统文件(含隐藏文件)# 9. 再次切换到ltx用户
root@hcss-ecs-d90d:\~# su ltx # 10. 确保位于ltx家目录
ltx@hcss-ecs-d90d:/root$ cd \~ # 11. 尝试复制mydir(失败:文件不存在)
ltx@hcss-ecs-d90d:\~$ cp mydir \~
cp: cannot stat 'mydir': No such file or directory
# 原因:当前目录(/home/ltx)没有mydir文件# 12. 尝试绝对路径复制(失败:权限不足)
ltx@hcss-ecs-d90d:\~$ cp /root/mydir \~
cp: cannot stat '/root/mydir': Permission denied
# 原因:普通用户无权读取/root目录# 13. 尝试递归复制(同样失败)
ltx@hcss-ecs-d90d:\~$ cp -r /root/mydir \~
cp: cannot stat '/root/mydir': Permission denied
# 原因:-r参数解决目录复制问题,但未解决权限问题# 14. 使用sudo提权复制(成功!)
ltx@hcss-ecs-d90d:\~$ sudo cp -r /root/mydir \~
[sudo] password for ltx: # 输入ltx用户密码
# sudo临时赋予root权限,突破目录访问限制# 15. 验证复制结果
ltx@hcss-ecs-d90d:\~$ ls -a
. .. .bash_history .bash_logout .bashrc mydir .profile
# 出现mydir目录,复制成功# 16. 查看目录结构
ltx@hcss-ecs-d90d:\~$ tree mydir
mydir
├── a
│ └── b
│ └── c
├── file.txt
└── test.txt
3 directories, 2 files
# tree命令显示完整目录结构(需安装tree包)# 18. 退出当前会话
ltx@hcss-ecs-d90d:\~$ exit
2.2 Linux权限管理详解
一、权限的本质与必要性
- 权限是什么?
权限是操作系统对资源访问的控制机制,通过限制用户对文件/目录的读写执行能力,保障系统安全与数据隔离。例如:VIP用户可访问会员区(r
),普通用户仅能查看公共区(r--
)。 - 为什么需要权限?
- 防止误操作或恶意破坏(如普通用户删除系统文件)。
- 实现多用户环境下的数据隐私(如用户A无法读取用户B的私人文件)。
- 超级用户(root)拥有无限制权限,普通用户受约束。
二、文件访问者分类(角色)
Linux将用户分为三类,通过角色+文件属性控制访问:
角色 | 身份定义 | 权限范围 | 存在意义 |
---|---|---|---|
所有者 (u) | 文件创建者或指定用户 | 可独立设置文件的rwx权限 | 明确责任主体,避免多人争改文件 |
所属组 (g) | 与文件关联的用户组 | 组内成员共享相同权限(如团队协作目录) | 简化批量权限管理 |
其他用户 (o) | 既非所有者也非组员的用户 | 默认限制性权限(如仅读) | 保护文件不被无关用户访问 |
示例:
文件report.txt
权限为-rw-r-----
(所有者可读写,组员仅读,其他人无权)。
若组员需编辑,命令:chmod g+w report.txt
→ 权限变为-rw-rw----
。
三、文件类型与访问权限
1. 文件类型(首字符标识)
类型 | 标识 | 示例 | 说明 |
---|---|---|---|
目录 | d | drwxr-xr-x | 存储文件的容器 |
普通文件 | - | -rw-r--r-- | 文本/二进制文件 |
软链接 | l | lrwxrwxrwx | 快捷方式 |
套接口 | s | srw-rw---- | 进程间通信文件 |
2. 权限作用
权限 | 文件功能 | 目录功能 |
---|---|---|
r | 读取内容 | 列出目录内容(如ls ) |
w | 修改内容 | 创建/删除目录内文件 |
x | 执行程序 | 进入目录(如cd ) |
关键区别:
- 目录的
w
权限不直接控制文件内容修改,而是控制文件增删。- 目录必须有
x
权限才能操作其内部文件。- 目录的
x
权限是进入前提(无x
则ls
失败)。- 目录的
w
权限需配合x
生效(否则无法创建文件)。
示例:
目录/projects
权限为drwxr-x---
:
- 所有者可进入、创建文件
- 组员可进入、查看文件列表
- 其他用户无法访问
四、权限值的表示方法
- 字符表示:
rwxr-xr--
- 分三段:
u
(所有者)、g
(组)、o
(其他) - 例如:
rwxr-x---
表示所有者可读/写/执行,组可读/执行,其他无权限。
- 分三段:
- 数字表示(8进制):
- r=4, w=2, x=1,三者相加
- 例如:
rwxr-x---
→u=4+2+1=7
,g=4+1=5
,o=0
→ 权限值750
。
五、权限设置方法
1. chmod:修改权限
# 符号法(操作直观)
chmod u+x script.sh # 给所有者增加执行权
chmod g-w data.txt # 移除组员的写入权
chmod o=r-- log.txt # 设置其他用户仅可读# 数字法(批量设置)
chmod 755 script.sh # rwxr-xr-x
注:仅文件所有者或root可执行。
2. chown:修改所有者
chown alice report.txt # 将所有者改为alice
chown alice:devteam project/ # 同时修改所有者和所属组
3. chgrp:修改所属组
chgrp developers app.py # 将文件所属组改为developers
4. umask:控制默认权限
-
作用:决定新建文件/目录的初始权限(非减法!)。
-
计算规则:
默认权限 = 基础权限 & ~umask- 文件基础权限:666(
rw-rw-rw-
) - 目录基础权限:777(
rwxrwxrwx
)
umask 022 # 查看当前掩码:0022 新建文件权限 = 666 & \~022 = 644(rw-r--r--) 新建目录权限 = 777 & \~022 = 755(rwxr-xr-x)[[4, 15]]
示例:
设umask=027
,新建文件权限:666 & \~027 = 640
(rw-r-----
)。 - 文件基础权限:666(
六、粘滞位(Sticky Bit)
1. 作用
为共享目录(如/tmp
)设置后:
- 允许:任何用户创建文件
- 禁止:非所有者删除他人文件(仅root/文件所有者/目录所有者可删)
解决痛点:避免共享目录中用户随意删除他人文件。
2. 设置与识别
chmod +t /shared_dir/ # 设置粘滞位
ls -ld /shared_dir/ # 查看目录权限末位显示't'(如 drwxrwxrwt)
示例:
用户A在/shared_dir
创建fileA
,用户B无法删除该文件,但可读/写自身文件。
总结
Linux权限通过 角色分离(u/g/o) 和 精细权限控制(r/w/x) 实现多用户环境的安全管理。chmod
、chown
、chgrp
提供灵活设置,umask
保障默认安全,而粘滞位解决了共享目录的删除冲突问题。理解文件与目录权限的差异(如目录需x
权限)是避免操作错误的关键。