本文面向 Linux 初学者,系统讲解 Shell 命令执行原理与 Linux 权限体系两大核心主题。全文目录如下:Shell 基础、命令分类、运行原理、PATH 环境变量、权限管理、chmod/chown/chgrp 修改权限、umask 文件掩码、粘滞位。建议按顺序阅读,并结合终端实操加深理解。
一、什么是 Shell
Shell 是一个命令行解释器,是用户和 Linux 内核之间的桥梁。
- 用户输入命令 → Shell 接收、解析 → 调用 Linux 内核完成任务 → 把结果返回给用户
- 现在终端里这个环境,就是 bash(Bourne Again Shell),Ubuntu 默认的 shell。
内核(kernel)不能直接接收文字命令;Shell 负责翻译。类比:内核 = 工厂,Shell = 前台接待员;你(用户)跟接待员说需求,接待员转告工厂干活。
二、Shell 命令分类(两大类)
1. 内置命令(shell builtin)
命令集成在 bash 程序内部,不需要单独外部程序文件。
- 特点:执行快,不创建新进程
- 例子:cd、pwd、echo、exit、type
原理:bash 自己代码里就实现了功能,直接调用,不用去磁盘找程序。
2. 外部命令(可执行程序)
独立的可执行文件,存放在系统 PATH 路径下(/bin /usr/bin)
- 你刚才用的:ls、tar、apt、sudo 全部都是外部命令
- 查看命令位置:type tar 或者 which tar
比如 tar:本质就是 /usr/bin/tar 这个二进制程序。
三、外部命令完整运行原理
以你执行 tar -cvf dirb.tar dirb 举例

- bash(父进程)调用系统函数 fork(),复制出一个子进程
- 子进程几乎和父 bash 一模一样,是独立新进程
- 子进程调用 exec 系统调用,把自己的内存替换成 /usr/bin/tar 程序,不再是 bash
- 传入参数 -cvf dirb.tar dirb,tar 程序开始执行打包逻辑
✅ 核心一句话:外部命令会 fork+exec 创建子进程执行;内置命令直接在当前 bash 进程运行,不创建子进程。
为什么 cd 是内置命令?
如果 cd 是外部命令,fork 出来子进程修改目录,只会修改子进程的工作目录,父 bash 目录完全不变,就达不到切换目录效果。所以 cd 必须内置。
四、PATH 环境变量
PATH 是冒号分隔的目录列表,外部命令就在这里查找。查看 PATH:
echo $PATH
当你输入 ls,shell 依次去 PATH 里的目录找有没有 ls 这个可执行文件。
如果命令不在 PATH 里,必须写绝对路径执行,例如 /usr/bin/tar
五、简单区分内置 / 外部命令
type cd
type tar
- cd is a shell builtin → 内置
- tar is /usr/bin/tar → 外部程序
六、补充:命令执行小细节
Linux 权限的概念
Linux 下有两种用户:超级用户(root)、普通用户。
• 超级用户:可以在 Linux 系统下做任何事情,不受限制
• 普通用户:在 Linux 下做有限的事情。
• 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令:su [用户名]
功能:切换用户。
例如,要从 root 用户切换到普通用户 user,则使用 su user。要从普通用户 user 切换到 root 用户则使用 su root(root 可以省略),此时系统会提示输入 root 用户的密码。
一、Linux权限管理
1. ⽂件访问者的分类(⼈)
• 文件和文件目录的所有者:u—User(属主)
• 文件和文件目录的所有者所在的组的用户:g—Group(属组)
• 其它⽤⼾:o—Others(外国⼈)
2. ⽂件类型和访问权限(事物属性)
• ⽂件类型:
d:⽂件夹
-:普通⽂件
l:软链接(类似Windows的快捷⽅式)
b:块设备⽂件(例如硬盘、光驱等)
p:管道⽂件
c:字符设备⽂件(例如屏幕等串⼝设备)
s:套接⼝⽂件
• 基本权限:
读(r/4):Read对⽂件⽽⾔,具有读取⽂件内容的权限;对⽬录来说,具有浏览该⽬录信息 的权限
写(w/2):Write对⽂件⽽⾔,具有修改⽂件内容的权限;对⽬录来说具有删除移动⽬录内 ⽂件的权限
执⾏(x/1):execute对⽂件⽽⾔,具有执⾏⽂件的权限;对⽬录来说,具有进⼊⽬录的权 限 ◦ “—”表⽰不具有该项权限
| r | read 读 | 查看文件内容 | 列出目录里的文件名(ls) |
| w | write 写 | 修改 / 覆盖文件内容 | 在目录里新建、删除、重命名文件 |
| x | execute 执行 | 运行可执行程序 / 脚本 | 进入目录(cd) |
二、字符表示方法(长列表 ls -l)
执行 ls -l,会看到类似:
-rw-r–r– 1 cl cl 123 xxx.txt
权限串:- rw- r– r–
<pre>
<ul>
示例拆解:-rw-r–r–
- -:普通文件
- rw-:属主:可读、可写、不可执行
- r–:组用户:仅可读
- r–:其他人:仅可读
字符方式修改权限 chmod
# 给属主增加执行权限
chmod u+x test.txt
# 去掉组的写权限
chmod g-w test.txt
# 给所有用户加上读权限
chmod a+r test.txt
# 组合写法:u加x,o去掉w
chmod u+x,o-w test.txt
三、八进制数值表示方法
规则:r=4,w=2,x=1 每一类用户的权限,把对应数字相加,得到一个 0~7 的数字:
表格
| r– | 4 |
| -w- | 2 |
| –x | 1 |
| rw- | 4+2=6 |
| r-x | 4+1=5 |
| rwx | 4+2+1=7 |
| — | 0 |
三组数字依次对应 u g o,组合成 3 位八进制数。
例子
八进制 chmod 修改权限
# 设置为644
chmod 644 test.txt
# 设置目录755
chmod 755 dirb
高频背诵总结
练习
ls -l dirb.tar
# 看dirb.tar的权限字符,换算成八进制
比如输出 -rw-r–r– → 644
一、chown:修改文件拥有者(属主 user)
格式:chown [参数] 用户名 文件名
- 实例
chown user1 f1 # 将f1的属主改为user1
chown -R user1 filegroup1 # -R 递归:把目录及其内部所有文件的属主全部改成user1
-R recursive 递归,目录权限修改必备,对子文件子目录生效
二、chgrp:修改文件 / 目录所属组 (group)
格式:chgrp [参数] 用户组名 文件名
- 常用选项:-R 递归修改所属组
chgrp users /abc/f2 # 将/abc/f2 的所属组改为 users
💡补充:chown 可以一次性同时改属主 + 属组,写法: chown user1:group1 test.txt
三、umask 文件掩码
作用:控制新建文件、目录的默认权限
原始预设最大权限:
- 新建普通文件初始上限:0666(rw-rw-rw-)
- 新建目录初始上限:0777(rwxrwxrwx)
实际权限公式:实际权限 = 预设权限 & ~umask 通俗理解:减去 umask 里有的权限
- 系统默认:
- root 超级用户:umask 0022
- 普通用户:umask 0002
umask # 查看当前掩码
umask 044 # 设置掩码为044
示例:普通用户 umask=0002 新建文件:666 – 002 = 664 → -rw-rw-r– 新建目录:777 – 002 =775 → drwxrwxr-x
⚠注意:umask只影响新建文件,已经存在的文件权限不会改变!
四、file 指令:辨识文件类型
语法:file [选项] 文件/目录
- -c:显示执行过程,排错
- -z:尝试解析压缩包内部文件类型
file dirb.tar
不看后缀,直接读取文件头部识别真实类型(Linux 不依赖扩展名)
五、sudo 权限分配
(1)修改 /etc/sudoers 授权
注意:/etc/sudoers权限必须是 740,不能随便改!
chmod 740 /etc/sudoers
vi /etc/sudoers
配置格式:
接受权限的用户 登陆主机=(以哪个用户执行) 允许执行的命令列表
(2)sudo 调用授权命令
sudo -u 用户名 命令
# 示例:以root身份执行useradd添加u2用户
sudo -u root /usr/sbin/useradd u2
六、目录权限【重中之重,极易踩坑】
目录的 r/w/x 和文件的 r/w/x 含义完全不一样!
<pre>
<blockquote>
目录没有 x 权限,就算有 r,也无法进入、访问里面文件
- r 读权限:ls列出目录内文件名;前提:必须有 x 权限
有 x 无 r:可以 cd 进目录,但是 ls 看不到文件名;但如果你知道文件名,可以直接访问这个文件
- w 写权限:在目录内新建、删除、重命名文件
核心考点: 只要你拥有目录的 w 权限,你就可以删除目录里面的文件,不管这个文件本身有没有写权限,也不管文件是谁创建的!
案例验证
chmod 0777 /home/ # /home目录全部用户rwx
touch /home/root.c # root创建文件root.c
su – litao # 切换普通用户litao
rm /home/root.c # litao可以直接删掉root创建的文件!
原因:litao 对/home目录拥有 w+x 权限,删除文件是修改目录内容,不是修改文件本身。
七、粘滞位(Sticky Bit,SBIT)【考试重点】
✅一句话:粘滞位是目录的特殊权限,专门解决:目录 777 开放写权限时,用户可以删除别人文件的问题。
⚠ 粘滞位只对目录生效,对普通文件基本无效。
1. 核心作用
给目录设置粘滞位之后: 哪怕所有人对这个目录拥有 w 写权限,目录内的文件,只能被下面 3 类人删除 / 重命名:
普通用户只能删除自己创建的文件,不能删除别人的文件。
对应你笔记里的案例: /home 权限 777,没粘滞位 → litao 可以删掉 root 创建的root.c 如果给/home加上粘滞位,就算目录是 777,litao 就删不掉 root 的文件。
2. 字符表示(ls -ld 查看)
粘滞位占用其他用户 o 的 x 权限位置:
- 目录本身有 x 权限 → 显示小写 t 例:drwxrwxrwt (经典/tmp权限)
- 目录本身没有 x 权限 → 显示大写 T
ls -ld /tmp
# 输出 drwxrwxrwt ,末尾的t就是粘滞位
3. 八进制表示
特殊权限在最高位:
- SUID=4,SGID=2,粘滞位 = 1
完整 4 位权限:1 777 → 1777 1代表开启粘滞位;后面 3 位是 ugo 普通权限。
示例: chmod 1777 shared_dir 含义:目录权限 rwxrwxrwx + 开启粘滞位。
4. 设置 / 删除粘滞位命令
# 符号方式(推荐)
chmod +t shared_dir # 添加粘滞位
chmod -t shared_dir # 移除粘滞位
八进制方式
chmod 1777 shared_dir
5. 典型应用:/tmp 目录
系统临时目录 /tmp 默认带粘滞位,权限1777
- 所有用户都可以在 /tmp 里新建文件
- 但是只能删除自己的临时文件,不能删除别人的
6. 背诵考点
7. 关联回顾
删除文件看上级目录的 w 权限,不是文件本身权限。
- 无粘滞位:目录 o 有 w → 任何人都可以删目录里任意文件。
- 有粘滞位:目录 o 有 w,但是只能删自己的文件。
八、权限总结
进入目录(cd 目录名),必须要有目录的 x(可执行)权限。
目录的 r/w/x 和文件含义完全不一样!
- x:能不能 cd 进入目录(最关键)
- r:进入目录后,能不能用ls列出里面的文件名
- w:能不能在目录里新建、删除、重命名文件
分 4 种组合情况
一句话记忆口诀
cd 看 x;ls 看 r;删建看 w。没有 x,r 和 w 基本都废掉!




