用户层 → Shell外壳(bash命令行) → Linux内核(kernel) → 硬件层Shell作为用户与内核的桥梁,负责接收用户指令并转换为内核能够理解的操作。
ls -l)转换为系统调用
PWD)、环境变量环境变量(PATH)等上下文信息
stdin)、输出(stdout)、错误(stderr)
ps aux | grep nginx)
# 示例命令执行过程
$ ls -l /home
执行步骤:
1. 用户输入命令字符串 "ls -l /home"
2. Bash读取输入并解析(识别命令、参数、选项)
3. 在系统路径中查找可执行程序(/bin/ls)
4. 创建子进程(通过fork系统调用)
5. 在子进程中执行程序(通过exec系统调用)
6. 内核加载并运行程序
7. 程序执行结果返回给Shell
8. Shell将结果输出到终端# 环境变量PATH决定了Shell查找命令的位置
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
# 查找顺序:按PATH中的目录顺序搜索第一个匹配的可执行文件
# 手动查找命令位置
$ which ls
/bin/ls
$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gzls、cp等,编译好的二进制可执行文件
cd、echo等,由Shell直接实现
# 查看命令类型
$ type ls
ls 是 /bin/ls
$ type cd
cd 是 shell 内嵌
# 内置命令示例
$ type echo
echo 是 shell 内嵌
$ type pwd
pwd 是 shell 内嵌# Shell执行外部命令时的系统调用序列
1. fork() # 创建子进程
2. exec() # 加载并执行程序
3. wait() # 等待子进程结束(前台命令)你(用户) → 下达命令的程序员
王婆(Shell) → 命令行解释器(bash/zsh等)
相亲规则(Shell语法) → 命令语法和规则
你的要求(命令) → 具体的指令字符串
小花(Kernel) → Linux操作系统内核
相亲结果(反馈) → 命令执行结果
提亲流程(通信) → 系统调用接口ls -l
[用户名@主机名 当前目录]命令行提示符
[user@hostname dir]$→ bash 命令行 → 媒婆的样子 shell(命令行解释器)、GUI(图形化界面):可以看成不同风格的媒婆,其核心功能都是一样的
# 使用strace跟踪命令执行过程
$ strace -f -e trace=process bash -c 'ls /home'
# 使用ltrace跟踪库函数调用
$ ltrace ls /home
# 查看系统调用统计
$ strace -c ls /home# 查看Shell进程信息
$ echo $$
1234 # 当前Shell的PID
# 查看子进程执行
$ ls /home & # 后台执行
$ jobs # 查看后台作业
[1]+ 运行中 ls /home &
# 查看进程树
$ pstree -p $$
bash(1234)───ls(5678)用户类型 | 命令提示符 | 权限范围 | UID |
|---|---|---|---|
超级用户(root) | # | 基本无权限约束,可执行大都操作 | 0 |
普通用户 | $ | 权限受限,只能操作授权资源 | ≥1000 |
su [选项] [用户名]- 或 -l:完全切换,加载目标用户的环境变量
-c:以目标用户身份执行单个命令
# 从user切换到root (需要密码)
$ su - root
密码:******
#
# 从root切换到user (无需密码)
# su - username
$
# 从user1切换到user2 (需要密码)
$ su - user2
密码:******
$返回原用户:
exit
Ctrl + D
# 使用sudo临时获取root权限 (需要配置 --- 将user添加到系统白名单/etc/sudoers)
$ sudo command
密码:****** (user自己的)
#
# 查看当前用户信息
$ whoami
$ id重要提示:
权限决定了一个操作是否允许被执行,包含两个关键要素:

d:文件夹
-:普通文件(Linux中,文本、可执行程序、库基本都属于普通文件)
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如:硬盘、光驱等)
p:管道文件(用于不同设备之间的通信)
c:字符设备文件(例如:键盘、显示器、串口设备)
s:套接口文件
注意:
Linux中文件后缀的处理原则:根据用户需求和应用程序要求而定。
重要区分:
所属组的意义:内部成员自己人,方便团队协作时权限管理。
rwxr-xr--权限分组说明:
字符含义:
r = 读权限
w = 写权限
x = 执行权限
- = 无权限
二进制枚举 每三个二进制位为一组
则可以看成一个八进制位
111 110 100 -> rwxrw-r-- -> 764
755 → rwxr-xr-x
644 → rw-r--r--数值计算原理:
r) = 4
w) = 2
x) = 1
无权限(-) = 0
权限计算示例:
# 拥有者权限:rwx = 4+2+1 = 7
# 所属组权限:r-x = 4+0+1 = 5
# 其他人权限:r-x = 4+0+1 = 5
# 总权限:755
# 拥有者权限:rw- = 4+2+0 = 6
# 所属组权限:r-- = 4+0+0 = 4
# 其他人权限:r-- = 4+0+0 = 4
# 总权限:644常用权限组合:
777 → rwxrwxrwx # 所有用户都有完全权限(危险,不推荐)
755 → rwxr-xr-x # 拥有者完全权限,其他人只读执行(常用)
644 → rw-r--r-- # 拥有者可读写,其他人只读(配置文件常用)
700 → rwx------ # 只有拥有者有完全权限(私密文件)注意:
谁能更改文件的访问权限:
chmod [对象][操作符][权限] 文件名-R:递归修改目录文件的权限u:拥有者
g:所属组
o:其他人
a:所有用户
+:添加权限
-:移除权限
=:设置精确权限
# 字符模式示例
chmod u+x file.txt # 给拥有者添加执行权限
chmod g-w file.txt # 移除所属组的写权限
chmod o=r file.txt # 设置其他人只有读权限
chmod a+x file.txt # 给所有用户添加执行权限
# 八进制模式示例
chmod 755 script.sh # rwxr-xr-x
chmod 644 config.conf # rw-r--r--
chmod 700 private.txt # rwx------
# 对象说明:
# u:拥有者 | g:所属组 | o:其他人 | a:所有用户
# 操作符说明:
# +:添加权限 | -:移除权限 | =:设置精确权限所有权转移规则:
这是Linux安全模型的基础,防止权限随意扩散
chown [选项] 用户名:组名 文件名-R 递归修改文件或目录的拥有者# 修改文件拥有者
chown user1 file.txt
# 修改文件拥有者和所属组
chown user1:group1 file.txt
# 一次性更改拥有者和所属组
chown user:group filename.txt
chown -R user:group directory/ # 递归修改目录及其所有内容chgrp [选项] 组名 文件名-R 递归修改文件或目录的拥有者chgrp developers file.txt
chgrp -R developers project/注意事项:
root 权限,所以经常需要配合 sudo
-R 选项时要特别小心,确保不会误改大量文件权限
# 文件权限设置
-r--rw---- 1 user1 groupA filename.txt
# 权限分解:
# user(拥有者): r-- (只读)
# group(所属组): rw- (读写)
# other(其他人): --- (无权限)
# 当前用户情况
$ whoami
user1
$ groups user1
user1 : user1 groupA groupB
# user1 既是文件的拥有者,又在所属组 groupA 中:试问他能执行写权限吗?核心规则:在进行权限认证时,系统按固定顺序检查,最终只能选择一个最优先匹配的身份
认证顺序:
案例分析
# 文件权限: -r--rw----
# 用户身份: user1 (既是拥有者,又在groupA中)
# 认证过程:
# 1. 检查是否为拥有者? → 是!user1就是拥有者
# 2. 立即应用拥有者权限:r-- (只读)
# 3. 认证结束,不再检查所属组权限
# 结果:user1 只能读,不能写这个文件# 创建测试环境
$ whoami
user1
# 创建文件并设置权限
$ touch test.txt
$ chmod 460 test.txt # -r--rw----
$ ls -l test.txt
-r--rw---- 1 user1 groupA 0 Oct 15 10:00 test.txt
# 验证用户所在组
$ groups
user1 groupA groupB
# 尝试写入(会失败)
$ echo "test" >> test.txt
-bash: test.txt: Permission denied
# 即使user1在groupA中,但因为它是拥有者,只能使用拥有者权限(r--)umask [权限值]为什么我们创建文件的默认权限是我们所看到的样子:
原理:
umask # 查看当前umask
umask 022 # 设置umask为022
umask 077 # 设置更严格的umask
# 计算示例(umask=022):
# 文件:666 & ~022 = 666 & 755 = 644 (rw-r--r--)
# 目录:777 & ~022 = 777 & 755 = 755 (rwxr-xr-x)目录文件的rwx具体含义:
r:是否允许查看该目录文件中的内容(ls命令)
w:是否允许在该目录文件中创建、更改、删除文件
x:是否允许进入该目录文件(cd命令)
重要特性:一个文件能否被删除,并不由文件本身决定,而由这个文件所处目录的w权限决定。
创建一个新用户:就是在家目录下创建了一个只有user才有rwx权限的目录文件
问题场景:共享目录下他人即使没有任何权限也能删除别人的文件?
共享目录:由root创建于用户家目录以外的文件夹
解决方案:黏滞位
# 设置黏滞位
chmod +t shared_directory/
ls -ld shared_directory/
drwxrwxrwt # t表示设置了黏滞位黏滞位的作用:
Shell作为用户与操作系统内核之间的桥梁,通过以下机制实现高效交互:
Linux权限系统通过用户身份认证和文件属性控制,实现了精细的访问控制:
核心要点:
这种分层设计既保证了操作系统的安全稳定,又为用户提供了相对简单易用的操作界面,是Unix/Linux系统哲学的重要体现。