[1. shell 命令 以及 运行原理](#1. shell 命令 以及 运行原理)
[1.1 操作系统内核 和 shell 命令行解释器](#1.1 操作系统内核 和 shell 命令行解释器)
[1.2 shell外壳程序的执行](#1.2 shell外壳程序的执行)
[1.3 shell外壳程序的作用](#1.3 shell外壳程序的作用)
[2. 权限](#2. 权限)
[2.1 普通账号 权限受限](#2.1 普通账号 权限受限)
[2.2 su [用户名]](#2.2 su [用户名])
[2.3 ctrl + d / exit](#2.3 ctrl + d / exit)
[2.4 su - [用户名]](#2.4 su - [用户名])
[2.5 root 登录普通账号不需要密码](#2.5 root 登录普通账号不需要密码)
[2.6 sudo 与 sudoers (权限白名单)](#2.6 sudo 与 sudoers (权限白名单))
[3. Linux 权限管理](#3. Linux 权限管理)
[3.1 权限的认知 and 权限角色rwx](#3.1 权限的认知 and 权限角色rwx)
[3.2 为什么分 所属组 ?](#3.2 为什么分 所属组 ?)
[3.3 groups](#3.3 groups)
[3.4 usermod -aG](#3.4 usermod -aG)
[3.5 修改 rwx 权限](#3.5 修改 rwx 权限)
[3.5.1 chmod u/g/o/a +/- /r/w/x](#3.5.1 chmod u/g/o/a +/- /r/w/x)
[u,g,o,a 都可组合,用逗号分隔](#u,g,o,a 都可组合,用逗号分隔)
[3.6 rwx 权限 的作用](#3.6 rwx 权限 的作用)
[3.7 root 账号几乎不受权限限制编辑](#3.7 root 账号几乎不受权限限制编辑)
[3.8 权限 只匹配一次](#3.8 权限 只匹配一次)
[3.9 二进制方式 修改 rwx 权限](#3.9 二进制方式 修改 rwx 权限)
[chmod 000/777](#chmod 000/777)
[3.10 更改文件的角色](#3.10 更改文件的角色)
[sudo chown [用户名] [文件]](#sudo chown [用户名] [文件])
[sudo chgrp [用户名] [文件]](#sudo chgrp [用户名] [文件])
[sudo chown [用户名]:[用户名]](#sudo chown [用户名]:[用户名])
[3.11 文件类型补充](#3.11 文件类型补充)
[4. rwx 权限的经典面试问题](#4. rwx 权限的经典面试问题)
[4.1 目录权限特殊,不能与普通文件混为一谈](#4.1 目录权限特殊,不能与普通文件混为一谈)
[5. 权限掩码](#5. 权限掩码)
[5.0 文件的起始权限](#5.0 文件的起始权限)
[5.1 umask 权限掩码的作用,意义,计算,使用场景](#5.1 umask 权限掩码的作用,意义,计算,使用场景)
[5.2 umask [000~777]](#5.2 umask [000~777])
[5.3 权限掩码细节问题](#5.3 权限掩码细节问题)
[6. 粘滞位 :解决文件删除漏洞](#6. 粘滞位 :解决文件删除漏洞)
[6.0 Linux 权限漏洞](#6.0 Linux 权限漏洞)
[6.1 Linux 共享文件 的问题](#6.1 Linux 共享文件 的问题)
[6.2 粘滞位 : chmod +t [目标目录]](#6.2 粘滞位 : chmod +t [目标目录])
[6.3 Linux中,固定存在 tmp 共享目录](#6.3 Linux中,固定存在 tmp 共享目录)
[7. file](#7. file)
1. shell 命令 以及 运行原理
1.1 操作系统内核 和 shell 命令行解释器
广义操作系统:操作系统 + 应用
狭义操作系统:操作系统内核 ,也叫kernal
我们不能直接使用操作系统内核。我们启动各种应用程序,都是经过一个翻译器,将我们的行为翻译给操作系统内核,然后内核再理解,执行我们的指令,从而打开应用程序
1.2 shell外壳程序的执行
这个翻译器是什么? ------shell(外壳)------ 命令行解释器
作用:接收用户指令,分析指令,发起执行,交给操作系统内核 加载、执行,返回执行结果:说到底就是执行二进制文件。
我们的指令,比如 ls ,大部分都是二进制文件,由C/C++代码写的。
指令也叫做:命令行提示符 ------ shell接收分析后,交给内核执行,并返回结果(操作的反馈)
1.3 shell外壳程序的作用
shell 外壳程序 可以拦截非法请求,变相保护操作系统内核
shell 外壳程序 不会直接分析命令行,而是创建子进程的方式,让子进程去分析命令,然后交给内核执行。
目的是:保护shell的安全
原因:执行可能会失败,失败会有概率挂掉子进程,而保护shell外壳程序自己不被挂掉。如果shell挂掉了,用户就无法与内核沟通了,所以shell不能轻易挂掉
1. Linux用到的 shell 外壳程序 叫做 : bash2. shell外壳程序是命令行解释器的总称,bash是具体的某一种命令行解释器
3.windows的外壳程序是------图形界面。我们使用鼠标点击图标,这个行为就是命令,被转化为了图形界面的指令,交给内核
4.安卓手机就是Linux内核
2. 权限
root超级账号,无视大部分权限。
普通账号,受到大部分权限限制。
2.1 普通账号 权限受限



2.2 su [用户名]
su : 切换用户,需要输入对应用户的密码,密码不回显
su,切换账号,路径不会发生变化
2.3 ctrl + d / exit
ctrl + d / exit: 退出登录当前账户,回到上一个账户。可快捷撤销 su 操作
exit 和 ctrl + d 效果一样
2.4 su - [用户名]

2.5 root 登录普通账号不需要密码


2.6 sudo 与 sudoers (权限白名单)

既然sudo一下,输入自己密码就可以获取权限,那要权限干嘛?要root干什么?
其实,默认情况下,普通账号无法sudo提权!会报错!需要特殊设置,在sudoer这个文件(白名单,一个普通文本配置文件)中加名,才准许使用!
普通账户是由它的root账号创建的!所以白名单也只能是root才能修改!
3. Linux 权限管理
3.1 权限的认知 and 权限角色rwx
权限的本质是:能 ?不能
权限是为了限制"角色"!
你能随意进入校长办公室,不是因为你是 人 ,而是因为 你是 校长! 权限限制角色
权限 = 角色 + 文件属性举例:拥有者 + rwx = 作为拥有者,有读写执行权
3.2 为什么分 所属组 ?
答案:解决团队对共享文件的权限问题!
如果只有拥有者 和 other,那除了拥有者,其他人都能随意修改,安全风险极高
但是去掉other权限---,上级等其他用户就无法查看内容,这样就不易检查维护,协作效率极低
权限中间层------所属组------避免两级分化
对于同项目的工作人员以及上级,可以拉入一个组,这样都可以查看,极大提高协作效率的同时,规避了外人对文件的修改
所以还有一个结论:所有用户,默认自成一组!
3.3 groups

3.4 usermod -aG
3.5 修改 rwx 权限

3.5.1 chmod u/g/o/a +/- /r/w/x
| 符号 | 英文全称 | 代表角色 | 含义 |
|---|---|---|---|
| u | user | 文件拥有者 | 只对文件所有者生效 |
| g | group | 文件所属组 | 只对文件所属组内用户生效 |
| o | other | 其他用户 | 既不是所有者、也不在组内的所有人 |
| a | all | 全部三者 | u + g + o 所有角色一起生效 |
user

group

other

all

u,g,o,a 都可组合,用逗号分隔

3.6 rwx 权限 的作用

那 x :可执行权呢?
可执行权,前提是二进制可执行文件!
3.7 root 账号几乎不受权限限制

3.8 权限 只匹配一次
如果你是拥有者,并且是所属组,但是你拥有者权限是 --- ,即便你所属组是rwx,你也无法执行任何操作
因为权限只匹配一次,匹配了,就中止向后查找。匹配了拥有者,所属组权限就不作数
如果验证?如下
3.9 二进制方式 修改 rwx 权限
chmod 000/777
rwx 对应二进制:111 ,--- 就是 000, 000-111十进制取值范围 :0 ~ 7
一共有3个"角色" :拥有者,所属组,other,每个范围都是0 ~ 7
十进制的方式,3个合在一起就是:000 ~ 777
| 二进制 | 十进制 | 权限 | 说明 |
|---|---|---|---|
| 000 | 0 | --- | 无任何权限 |
| 001 | 1 | --x | 仅执行 |
| 010 | 2 | -w- | 仅写入 |
| 011 | 3 | -wx | 写 + 执行 |
| 100 | 4 | r-- | 仅读取 |
| 101 | 5 | r-x | 读 + 执行 |
| 110 | 6 | rw- | 读 + 写 |
| 111 | 7 | rwx | 读 + 写 + 执行 |

3.10 更改文件的角色
sudo chown [用户名] [文件]

sudo chgrp [用户名] [文件]

sudo chown [用户名]:[用户名]

3.11 文件类型补充

4. rwx 权限的经典面试问题
进入一个 目录 需要什么权限?
什么决定了 文件 或 目录 的默认权限?
root新建的文件,普通用户无法读写执行,那可以删除吗?
| 对目录的权限 | 对目录的真实作用 | 通俗理解 |
|---|---|---|
| r | 读取目录内容(列表) | 能 ls 看文件名字 |
| w | 修改目录结构(增 / 删 / 改文件名) | 能删文件 、能新建文件,哪怕是任何人创建的! |
| x | 访问目录(进入 / 使用路径) | 能 cd 进去,能访问文件内容 |
4.1 目录权限特殊,不能与普通文件混为一谈
| 权限符号 | 普通文件的作用 | 目录的作用 | 区别 |
|---|---|---|---|
| r | 读取文件内容 | 读取目录内的文件列表 | 目录内都是文件,文件内都是内容 |
| w | 修改文件内容 | 修改目录结构,删除文件 | 目录是文件结构,可删文件,文件是内容,可改内容 |
| x | 执行文件 | 进入目录 | 执行,完成文件的功能,进入目录,完成目录的功能 |
5. 权限掩码
5.0 文件的起始权限
| 类型 | 起始权限 | 起始十进制 | umask 权限掩码 | 掩码后最终权限 | 最终十进制 |
|---|---|---|---|---|---|
| 普通文件 | rw-rw-rw- | 666 | 002 | rw-rw-r-- | 664 |
| 目录 | rwxrwxrwx | 777 | 002 | rwxrwxr-x | 775 |
普通文件,不需要执行权 x ,默认不给 x 权限。若是二进制可执行文件,chmod手动添加 x
目录的执行权决定能否进入目录,目录就是为了被进入!所以是刚需,必须给
5.1 umask 权限掩码的作用,意义,计算,使用场景
Linux中,存在权限掩码
作用:从起始权限中,掩盖掉权限掩码中出现的权限
意义:灵活调整创建文件的最终权限!
使用场景:批量化处理文件的最终权限,配合test{1..1000}.txt 使用
最终权限 = 起始权限 & (~ 权限掩码)
5.2 umask [000~777]
5.3 权限掩码细节问题

6. 粘滞位 :解决文件删除漏洞
6.0 Linux 权限漏洞
普通账号可删除 root账号创建的文件,即使无权限 rwx
因为删除文件,是由目录的权限 w 决定!你的文件创建在我的目录,我有权删你
目录最终权限775,说明:其他普通用户,无法在我的目录创建文件,因为没有 w 权
6.1 Linux 共享文件 的问题
共享文件,必须去公共的区域,不能在家目录。因为其他用户(除root)无法进入别人家目录,一般在root根目录下
共享文件,假设不给other权限,只给u,g权限,
这意味着:任何第三方(除root)都无法查看,修改该文件!
但存在隐患:任意第三方都能删除该文件!因为该文件无权出现在我的目录!
如何解决?给共享目录去掉 w 权限?No,这样共享双方都无法修改,交流,失去了共享的意义。
6.2 粘滞位 : chmod +t [目标目录]
给 共享目录设置 粘滞位 : chmod +t [目标目录]
需求:
任何人(共享者)都能在共享目录新建文件,但是,自己只能删除自己所创建的!
设置 粘滞位 后,能删除文件的只有:1.root 2.目录所有者 3. 自己的文件
6.3 Linux中,固定存在 tmp 共享目录
根目录下,Linux默认存在一个共享目录------tmp,这是官方设置的,带粘滞位的标准共享目录
7. file
file : 可查看文件详细信息:判断是什么文件(文本文件,二进制可执行文件,目录...)
判断文件是否为空,显示详细信息:





















