💭 写在前面
本章我们将重点讲解 Linux 权限,这是 Linux 基础部分中非常重要的一部分。内容比较干,我会稍稍正经些去讲解。话不多说,我们直接切入正题。
Ⅰ. shell 命令及运行原理
0x00 什么是 shell
严格意义上说的是一个操作系统,我们称之为 —— (核心),
但我们一般用户,是不能直接使用 的,而是通过 的 "外壳" 程序,
也就是所谓的 ,来与 进行 "沟通 " 。
中, 就是命令行解释器(command Interpreter),其主要包含:
① 将使用者的命令翻译给 处理。 ② 同时将 的处理结果翻译给使用者。
中, 就是 (图形化界面),
我们操作 也不是直接操作 内核的,
而是通过图形接口,点击从而完成我们的操作,所以其实也是一个外壳程序。
对于 ,有相同的作用,主要是对我们的指令进行解析,
解析指令给 内核。反馈结果在通过内核运行出结果,通过 解析给用户。
0x01 shell 的意义
❓ 思考:为什么不能直接使用 ,而是要通过 ?
① 降低操作 OS 的成本:用户不善于和内核沟通,需要通过外壳来做解释。
② 保护操作系统:外壳的存在让内核不会暴露给用户,用户所有的非法、不合理操作会直接被外壳拦住,某种意义上来说是对操作系统的一种保护。
我们通常采用的命令行解释器,命令并不是 而是 bash,
它是存在于 /usr/bin 目录下的一个可执行文件:
我们的 常用的命令行解释器(shell),叫做 bash。
他们两个之间有什么关系呢? 是所有解释器的统称,bash 是具体的一款解释器。
bash 属于 中的一种,常见的 工具:sh、bash、csh、tcsh、ash 等。
它们的关系就像是 Linux 和 Centos7.6 的关系,一个是统称的,一个是具体的。
Ⅱ. Linux 权限
0x00 Linux 具体用户的分类
Linux 的用户分为 root 和普通用户,root 为超级用户,就像 Windows 系统中的管理员。
超级用户:可以在 Linux 系统下做任何事情,不受限制。
普通用户:在 Linux下做有限的事情。
超级用户的命令提示符是 # ,普通用户的命令提示符是 $ 。
💭 确认当前你是哪个用户,可以输入 whoami 指令:
whoami
💭 我们当前是普通用户,如果想切换至 root 用户,我们可以输入 su -
su -
root 和 Linux 下任何一个用户,都要设置密码。
建议不要把 root 密码和普通用户的密码设置成一样的! 这不仅是出于安全角度,
设置成一样的话现阶段容易搞混,你不知道什么时候要输的是什么密码。
这里我们要切到 root,所以输入的是 root 的密码:
(输入密码时是不回显的,并不是没输进去)
💭 实操:当我们 su - 并输入正确的密码后,就可以完成用户的切换操作:
$ su - Password:
在 root 用户下,想要切到普通用户甚至连密码都不需要输:
# su [用户名]
当然,如果你是普通用户想切换到另一个普通用户,当然还是需要输入密码的。
$ su [用户名] Password:
root 什么身份都可以切,切到你账户删库跑路记录的还是你账户自己删的。
即便是不切,通过 root 拿你数据库的 "私♂密♂数♂据", 多危险!由此可见 root 账号非常重要!
root 密码一定不能设置的太简单!设置的太简单,就相当于是 "裸奔" !
0x01 Linux 中文件相关的权限概念
当我们输入 ls -l 显示详细信息时,你有没有注意过这些信息?
通过 ls -l 显示出来的是 文件的属性,而用过 cat 看到里面的是 文件的内容。
0x02 文件类型
我们既然要学习权限,我们重点要理解 ls -l 显示的若干的字母组合。
-rw-rw-r-- drwxrwxr-x
第一列的第一个字符,叫做 "文件类型" 。
Linux 中不是以文件名后缀区分文件类型的,而是通过 ls -l 显示的第一个字符区分文件类型的。
这有点颠覆我们的直觉,因为我们 Windows 是文件末尾 [ .类型 ] 的格式去区分文件类型:
而在 Linux 下你跟我说文件类型跟后缀没有关系?!我们验证一下看看:
在我们 Windows 下,这里的 a.txt 这就是一个文本,但是在 Linux 是完全不关心你后缀是什么的。
Linux 的文件后缀纯属摆设,我们写后缀只是是为了给自己看的。
📚 概念:Linux 是根据第一列第一个字符去区分文件的类型的。
- 普通文件,文本、源代码、可执行文件、第三方动态库等。
目录文件
链接文件(比如快捷方式)
管道文件
块设备文件,磁盘
字符设备文件
📌 注意事项:
既然 Linux 文件后缀纯属摆设,那我们把 test.c 改成 test.txt,然后用 gcc 编译可以吗?
( 絕對不可以!)
虽然 Linux不以文件名后缀区分类型,但是 Linux 并不排斥以后缀做文件类型。
0x03 基本权限
❓ 思考:什么是权限?
① 约束人的(对人进行分类)
② 需要对应的事物具有特定的属性
Linux 上,对文件的权限:
这个文件谁能访问?这个文件谁不能访问?
对应的文件应该具备的某种属性:r,w,执行 x
所以权限的概念以及操作都是围绕人和概念的属性展开的。
在 Linux 系统中,人分三类:
① 文件的拥有者 owner ② 文件的所属组 grouper ③ 文件的其他用户 other
Linux 系统中文件的权限属性分为 r(读)、w(写)、x(可执行)。
root 和普通用户都可称为文件的拥有者、所属组、其他用户,他们并不冲突,反而是相互补充的。
每一组,对应的权限的为止含义是确定的。
那么文件的权限操作,应该涉及到几方面呢? ① 修改文件的属性 ② 修改人
0x04 文件权限值的表示方法
📚 字符表示方法:
Linux 表示 | 说明 | Linux 表示 | 说明 |
只读 | 仅可写 | ||
仅可执行 | 可读可写 | ||
可写可执行 | 可读可执行 | ||
可读可写可执行 | 无权限 |
只需要搞明白 r w x - 这四个字符分别代表说明意思,就能轻松理解。
📚 八进制数值表示方法:推荐使用 👍
权限符号(读写执行) | ||
4 | 100 | |
2 | 010 | |
1 | 001 | |
6 | 110 | |
5 | 101 | |
3 | 011 | |
7 | 111 | |
- - - | 0 | 000 |
(利用八进制数值进行操作,用起来会非常的方便,等下面讲完文件的修改操作后再详细讲解)
0x05 file 指令
❓ 思考:如何区分一个文件?
显然这一串信息是无法满足我们了,我们还有一个专门用来辨识文件类型的指令 —— file 指令。
file [选项] 文件或目录
🔨 功能:辨识文件类型
📜 常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容。
💭 操作演示:file
Ⅲ. 文件权限的修改
0x00 chmod 指令
chmod [参数] 权限 文件名
🔨 功能:设置文件的访问权限
📜 常用选项:
R -> 递归修改目录文件的权限。
说明:只有文件的拥有者和root才可以改变文件的权限。
chmod 命令权限值的格式:
① 用户表示符+/-=权限字符
+ 向权限范围增加权限代号所表示的权限
- 向权限范围取消权限代号所表示的权限
= 向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
比如:
# chmod u+w /home/abc.txt # chmod o-x /home/abc.txt
看蒙了也没关系,我们直接看操作演示,会轻松很多:
💭 操作演示:去掉某身份的权限
如果我想去掉某身份的读权限,我们可以:
chmod [分类]-[权限] {文件名] # 去除权限
好,现在拥有者、所属组和 other 都没有读的权限了。
我们可以给让它们把读权限加回去吗?当然可以:
chmod [分类]+[权限] {文件名] # 添加权限
0x01 指令的复合使用
当然,还允许复合使用:
0x02 root 用户不受权限约束
当你什么权限都没有时,会受到种种限制:
然而这些限制对至高无上的 root 来说,并没有什么卵用:
0x03 八进制数值表示方法
讲完权限的修改了,我们再回到 Ⅱ.0x04 继续探讨 "八进制数值表示方法"。
权限符号(读写执行) | ||
4 | 100 | |
2 | 010 | |
1 | 001 | |
6 | 110 | |
5 | 101 | |
3 | 011 | |
7 | 111 | |
- - - | 0 | 000 |
任何一个八进制数(0~7)都可以被写成三个比特位,这三个比特位壹壹和每一类人对应。
我们有三类人,则需要3个八进制数与之对应,所以就有了 777、000、333 等更改权限的方案。
譬如 的 - - - 分别对应 ,有或者无(两态),111 → 八进制 → 7。
→ 5 → 101 → ,原理是将八进制看作成二进制,对应上我们的权限。
💭 用法演示:八进制数值表示方法