本文面向 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 tar
cd 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权限管理
- ⽂件访问者的分类(⼈)
• 文件和文件目录的所有者:u---User(属主)
• 文件和文件目录的所有者所在的组的用户:g---Group(属组)
• 其它⽤⼾:o---Others(外国⼈)
- ⽂件类型和访问权限(事物属性)
• ⽂件类型:
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 基本都废掉!
