【Linux】Shell 命令以及运行原理+权限管理

本文面向 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 举例

  1. 读取命令 :bash 读取你敲的整行字符串 tar -cvf dirb.tar dirb
  2. 命令解析、分词 :按空格分割成 tar、-cvf、dirb.tar、dirb;识别命令名是 tar
  3. 查找程序 :去环境变量 PATH 里面的目录依次搜索,找到 /usr/bin/tar
  4. fork 创建子进程
    • bash(父进程)调用系统函数 fork(),复制出一个子进程
    • 子进程几乎和父 bash 一模一样,是独立新进程
  5. exec 程序替换
    • 子进程调用 exec 系统调用,把自己的内存替换成 /usr/bin/tar 程序,不再是 bash
    • 传入参数 -cvf dirb.tar dirb,tar 程序开始执行打包逻辑
  6. 等待子进程结束 :父 bash 调用 wait(),卡住等待 tar 子进程运行完毕
  7. 子进程退出 :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 → 外部程序

六、补充:命令执行小细节

  1. 命令行先做通配符展开 :*.txt 会在传给程序前,替换成所有 txt 文件名
  2. 引号:双引号 " " 保留变量;单引号 ' ' 原样输出,不解析变量
  3. ; 分隔多条命令:ls;pwd 顺序执行,不管前面成功失败
  4. &&:前面成功才执行后面: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(外国⼈)

  1. ⽂件类型和访问权限(事物属性)

• ⽂件类型:

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. 第 1 位:文件类型 (不属于权限!)

    复制代码
    <pre>

    <ul>

  2. - 普通文件

  3. d 目录

  4. l 软链接

  5. 第 2~4 位:u 属主权限

  6. 第 5~7 位:g 用户组权限

  7. 第 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 位八进制数。

例子

  1. rw-r--r-- u: rw- = 4+2=6 g: r-- =4 o: r-- =4 👉 权限:644(普通文件默认推荐)
  2. rwxr-xr-x u: rwx=7 g: r-x=5 o: r-x=5 👉 755(目录 / 可执行程序常用)
  3. rwx------ u:7,g:0,o:0 👉 700(只有所有者能读写执行)

八进制 chmod 修改权限

复制代码
# 设置为644
chmod 644 test.txt
# 设置目录755
chmod 755 dirb

高频背诵总结

  1. 字符:r w x,分 u (属主) g (组) o (其他);ls -l查看。
  2. 八进制:r=4,w=2,x=1,三组数字,u g o。
  3. 文件类型位不属于权限位!第一位 - / d / l 不是 rwx 权限。
  4. 目录 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

-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 含义完全不一样!

  1. 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 类人删除 / 重命名:

  1. 文件的所有者
  2. 目录的所有者
  3. root 超级用户

普通用户只能删除自己创建的文件,不能删除别人的文件。

对应你笔记里的案例: /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. 背诵考点

  1. 粘滞位作用对象:仅目录。
  2. 作用:共享目录开放写权限时,限制用户只能删除自己的文件,不能删除他人文件。
  3. 字符标记:权限串最后一位 t(有 x) / T(无 x)。
  4. 八进制:1xxx,最高位 1 代表粘滞位。
  5. 可删除文件的三类用户:文件属主、目录属主、root。

7. 关联回顾

删除文件看上级目录的 w 权限,不是文件本身权限。

  • 无粘滞位:目录 o 有 w → 任何人都可以删目录里任意文件。
  • 有粘滞位:目录 o 有 w,但是只能删自己的文件。

八、权限总结

进入目录(cd 目录名),必须要有目录的 x(可执行)权限。

目录的 r/w/x 和文件含义完全不一样!

  • x:能不能 cd 进入目录(最关键)
  • r:进入目录后,能不能用ls列出里面的文件名
  • w:能不能在目录里新建、删除、重命名文件

分 4 种组合情况

  1. 目录有 x,无 r ✅ 可以cd进入目录 ❌ ls看不到文件列表 ✅ 如果你知道文件名 ,可以直接访问这个文件(比如cat test.txt)
  2. 目录有 r,无 x (你刚才 dirc 就是这个情况!d----w--w-,没有 x) ❌ 不能 cd 进入目录!哪怕有 r 读权限也不行 ❌ 无法访问目录里面任何文件
  3. 目录有 r+x ✅ cd 进入 ✅ ls 列出所有文件
  4. 目录有 w,无 x ❌ 不能 cd 进入 ❌ w 权限完全失效,无法新建 / 删除文件

一句话记忆口诀

cd 看 x;ls 看 r;删建看 w。没有 x,r 和 w 基本都废掉!

相关推荐
djjjx.1 小时前
Linux工具篇 (六):GDB 调试从底层逻辑到高阶实战
linux·运维·服务器·gdb
IT大白鼠1 小时前
彭大帅的AI运维助手实战案例 5 · 新接手的服务器,先让 AI 摸底
运维·服务器·人工智能
coward912 小时前
RK3576 双千兆 GMAC 驱动加载异常问题排查与总结
linux
幼儿园蛋小黄2 小时前
从设备树到 ARM 驱动:嵌入式 Linux 驱动开发学习总结
linux·arm开发·驱动开发
dishugj2 小时前
HANA集群计划内切换与维护操作
java·linux·数据库
该逃避避2 小时前
出海广告跑不起来怎么办?动态住宅IP助力广告跑量
运维·服务器·网络
一条泥憨鱼2 小时前
【从0开始学习计算机网络】| ip协议-ttl-标识-分片偏移-ip分片与重组
运维·服务器·网络
爱吃香菜的初学者4 小时前
十四.Linux——消息队列
linux·运维·开发语言
姜鱼问生10 小时前
Nginx 缓存命中率监控:从 X-Cache-Status 到实时统计
运维·nginx·缓存