本文面向 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 读取你敲的整行字符串
tar -cvf dirb.tar dirb - 命令解析、分词:按空格分割成
tar、-cvf、dirb.tar、dirb;识别命令名是tar - 查找程序:去环境变量
PATH里面的目录依次搜索,找到/usr/bin/tar - fork 创建子进程
- bash(父进程)调用系统函数
fork(),复制出一个子进程 - 子进程几乎和父 bash 一模一样,是独立新进程
- bash(父进程)调用系统函数
- exec 程序替换
- 子进程调用
exec系统调用,把自己的内存替换成/usr/bin/tar程序,不再是 bash - 传入参数
-cvf dirb.tar dirb,tar 程序开始执行打包逻辑
- 子进程调用
- 等待子进程结束:父 bash 调用
wait(),卡住等待 tar 子进程运行完毕 - 子进程退出:tar 执行完,子进程销毁;bash 重新弹出命令提示符
$,等待你输入下一条命令
✅ 核心一句话:外部命令会 fork+exec 创建子进程执行;内置命令直接在当前 bash 进程运行,不创建子进程。
为什么cd是内置命令?
如果 cd 是外部命令,fork 出来子进程修改目录,只会修改子进程的工作目录,父 bash 目录完全不变,就达不到切换目录效果。所以 cd 必须内置。
四、PATH 环境变量
PATH是冒号分隔的目录列表,外部命令就在这里查找。查看 PATH:
echo $PATH当你输入ls,shell 依次去 PATH 里的目录找有没有ls这个可执行文件。
如果命令不在 PATH 里,必须写绝对路径执行,例如
/usr/bin/tar
五、简单区分内置 / 外部命令
type cd type tarcd is a shell builtin→ 内置tar is /usr/bin/tar→ 外部程序
六、补充:命令执行小细节
- 命令行先做通配符展开:
*.txt会在传给程序前,替换成所有 txt 文件名 - 引号:双引号
" "保留变量;单引号' '原样输出,不解析变量 ;分隔多条命令:ls;pwd顺序执行,不管前面成功失败&&:前面成功才执行后面:mkdir test && cd test
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--
- 第 1 位:文件类型(不属于权限!)
<pre><ul> -普通文件d目录l软链接- 第 2~4 位:u 属主权限
- 第 5~7 位:g 用户组权限
- 第 8~10 位:o 其他用户权限
示例拆解:-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 位八进制数。
例子
rw-r--r--u: rw- = 4+2=6 g: r-- =4 o: r-- =4 👉 权限:644(普通文件默认推荐)rwxr-xr-xu: rwx=7 g: r-x=5 o: r-x=5 👉755(目录 / 可执行程序常用)rwx------u:7,g:0,o:0 👉700(只有所有者能读写执行)
八进制 chmod 修改权限
# 设置为644 chmod 644 test.txt # 设置目录755 chmod 755 dirb高频背诵总结
- 字符:
r w x,分 u (属主) g (组) o (其他);ls -l查看。 - 八进制:
r=4,w=2,x=1,三组数字,u g o。 - 文件类型位不属于权限位!第一位
- / d / l不是 rwx 权限。 - 目录 x 权限:控制能否 cd 进入目录。
练习
ls -l dirb.tar # 看dirb.tar的权限字符,换算成八进制比如输出
-rw-r--r--→ 644一、chown:修改文件拥有者(属主 user)
格式:
chown [参数] 用户名 文件名
- 实例
chown user1 f1 # 将f1的属主改为user1 chown -R user1 filegroup1 # -R 递归:把目录及其内部所有文件的属主全部改成user1
-Rrecursive 递归,目录权限修改必备,对子文件子目录生效二、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 0002umask # 查看当前掩码 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含义完全不一样!
- x 执行权限:能否
cd进入这个目录<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 类人删除 / 重命名:
- 文件的所有者
- 目录的所有者
- root 超级用户
普通用户只能删除自己创建的文件,不能删除别人的文件。
对应你笔记里的案例:
/home权限 777,没粘滞位 → litao 可以删掉 root 创建的root.c如果给/home加上粘滞位,就算目录是 777,litao 就删不掉 root 的文件。2. 字符表示(ls -ld 查看)
粘滞位占用其他用户 o 的 x 权限位置:
- 目录本身有 x 权限 → 显示小写
t例:drwxrwxrwt(经典/tmp权限)- 目录本身没有 x 权限→ 显示大写
Tls -ld /tmp # 输出 drwxrwxrwt ,末尾的t就是粘滞位3. 八进制表示
特殊权限在最高位:
- SUID=4,SGID=2,粘滞位 = 1
完整 4 位权限:
1 777→17771代表开启粘滞位;后面 3 位是 ugo 普通权限。示例:
chmod 1777 shared_dir含义:目录权限 rwxrwxrwx + 开启粘滞位。4. 设置 / 删除粘滞位命令
# 符号方式(推荐) chmod +t shared_dir # 添加粘滞位 chmod -t shared_dir # 移除粘滞位 八进制方式 chmod 1777 shared_dir5. 典型应用:/tmp 目录
系统临时目录
/tmp默认带粘滞位,权限1777
- 所有用户都可以在 /tmp 里新建文件
- 但是只能删除自己的临时文件,不能删除别人的
6. 背诵考点
- 粘滞位作用对象:仅目录。
- 作用:共享目录开放写权限时,限制用户只能删除自己的文件,不能删除他人文件。
- 字符标记:权限串最后一位
t(有 x) /T(无 x)。- 八进制:1xxx,最高位 1 代表粘滞位。
- 可删除文件的三类用户:文件属主、目录属主、root。
7. 关联回顾
删除文件看上级目录的 w 权限,不是文件本身权限。
- 无粘滞位:目录 o 有 w → 任何人都可以删目录里任意文件。
- 有粘滞位:目录 o 有 w,但是只能删自己的文件。
八、权限总结
进入目录(cd 目录名),必须要有目录的x(可执行)权限。
目录的 r/w/x 和文件含义完全不一样!
x:能不能cd进入目录(最关键)r:进入目录后,能不能用ls列出里面的文件名w:能不能在目录里新建、删除、重命名文件
分 4 种组合情况
- 目录有 x,无 r✅ 可以
cd进入目录 ❌ls看不到文件列表 ✅ 如果你知道文件名,可以直接访问这个文件(比如cat test.txt) - 目录有 r,无 x(你刚才 dirc 就是这个情况!
d----w--w-,没有 x) ❌不能 cd 进入目录!哪怕有 r 读权限也不行 ❌ 无法访问目录里面任何文件 - 目录有 r+x✅ cd 进入 ✅ ls 列出所有文件
- 目录有 w,无 x❌ 不能 cd 进入 ❌ w 权限完全失效,无法新建 / 删除文件
一句话记忆口诀
cd 看 x;ls 看 r;删建看 w。没有 x,r 和 w 基本都废掉!