目录
一. shell 及其运行原理
1.1 windows 和 linux 下的shell
二. Linux 的权限
2.1 linux 的用户
2.2 添加\删除用户
2.2.1 添加用户
2.2.2 修改密码
2.2.3 删除用户
2.3 su 和 su -
2.3.1 su
2.3.1.1 代码示例 超级用户切换为普通用户
2.3.1.2 代码示例 普通用户切换为超级用户
2.3.2 su -
2.3.3 切换用户的本质
2.3.3.1 exit
2.3.3.2 切换用户的本质
2.4 sudo
2.4.1 sudo 的白名单机制
2.5 权限的深度认识
2.5.1 权限的本质
2.5.2 对权限的理解
2.5.3 三大角色
2.5.4 文件的三种权限属性
2.4 chmod
2.4.1 chmod命令权限值的格式
2.4.2 代码示例
2.4.3 相关小知识
2.4.3.1 一次性修改多个角色权限
2.4.3.2 修改文件权限的限制
2.4.3.3 用户角色确定的唯一性
2.4.3.4 root 权限不受控
2.4.3.4 可执行权限 != 可执行
2.4.4 数字表示法
2.4.4.1 代码示例
2.5 chown
2.5.1 chown 使用注意事项
2.6 chgrp
2.6.1 chgrp 使用注意实现
2.6.2 代码示例
一. shell 及其运行原理
Linux严格意义上说的是⼀个操作系统 ,我们称之为 “核心(kernel)“ ,但我们⼀般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
回答一:
Shell 是运行在操作系统内核之外的命令行解释器,可以理解为操作系统的一层“外壳”。它为用户提供命令行界面,负责接收并解析用户输入的命令,然后执行内置命令或启动相应程序,这些程序再通过系统调用与操作系统内核交互,最后将执行结果显示给用户。
回答二:
那我们不妨想想使用外壳程序有什么好处
1. 方便用户操作。
2. 当用户输入非法指令时,shell 可以及时拦截下来,保护操作系统内核。
3. 当有新命令来时,外壳程序本身并不会去执行,而是让子进程去执行,保护外壳程序本身。
1.1 windows 和 linux 下的shell
windows 的外壳程序可以理解为是命令行外壳或者图形化界面外壳。
linux 常用的命令行外壳是bash,linux 也有图形化界面,但这里不再过多介绍。
二. Linux 的权限
2.1 linux 的用户
linux 的用户可以分为两种:
- 超级用户(root):命令提示符为#,可执行系统中任何操作(如删除系统文件、修改权限),不受限制;
- 普通用户:命令提示符为$,仅能操作自己权限范围内的文件(如修改自己的文档),受严格限制。
2.2 添加\删除用户
2.2.1 添加用户
使用下面指令,然后按照要求完成即可:
adduser 用户名2.2.2 修改密码
使用下面指令,然后按照要求完成即可:
passwd 用户名2.2.3 删除用户
使用下面指令,然后按照要求完成即可:
加上选项 -r 表示把用户账户和它的家目录一起删掉,不加 -r 则只会删掉账号
userdel -r 用户名2.3 su 和 su -
2.3.1 su
su 主要用于切换用户。
2.3.1.1 代码示例 超级用户切换为普通用户
su 用户名2.3.1.2 代码示例 普通用户切换为超级用户
su2.3.2 su -
su - 的用法和 su 别无二致,我们来重点讲讲二者的不同:
su主要切换用户身份;su -不仅切换身份,还切换到目标用户完整的登录环境。举个例子:假设我先以普通用户lzx的身份登录,那么此时我所处目录应该是/home/lzx,su 切换至超级用户,所处目录还是/home/lzx;su - 切换至超级用户,所处目录变为/root
2.3.3 切换用户的本质
2.3.3.1 exit
我们先来认识一下exit,exit 就是用来退出当前用户,和我们之前介绍的ctrl + d比较相似。
2.3.3.2 切换用户的本质
当我们由普通用户切换至超级用户,再按 ctrl +d 或者 exit 退出登录时,我们会发现并没有退出到登陆界面,而是回到了普通用户
那么我们也就明白了 su 和 su - 的本质并不是单纯的切换用户,而是在外面又套了一层,让执行角色发生了改变
2.4 sudo
sudo 可以理解为是对命令进行提权,以 root 权限执行。
2.4.1 sudo 的白名单机制
我们在使用 sudo 的时候往往会出现这样的错误:
也就是说未写入文件 sudoers 的用户不能对命令进行提权
解决办法只能是让超级用户将该用户添加到文件 sudoers 当中
2.5 权限的深度认识
2.5.1 权限的本质
权限就是限制一个用户能做什么不能做什么。
2.5.2 对权限的理解
权限首先限制的是角色;权限要求目标必须具备对应的属性
也就是说权限=角色+目标权限属性。
2.5.3 三大角色
目标权限属性好理解,因为Linux下一切皆文件,文件的权限属性大致可以分为读、写、执行。我们先来理解下角色。
每个文件 / 目录都有三类 “访问者(角色,身份)”,对应不同的权限范围,这是权限控制的核心:
- u(User,所有者):文件当前的所有者。例如
hello.txt的所有者是whb,系统访问该文件时,如果当前用户就是文件所有者,就使用u对应的权限进行判断。- g(Group,所属组):文件所属的用户组。例如
hello.txt属于whb组;如果当前用户不是所有者,但属于该文件的所属组,就使用g对应的权限。- o(Others,其他用户):当前用户既不是文件所有者,也不属于该文件的所属组时,就按照
o对应的权限进行判断。
2.5.4 文件的三种权限属性
| 权限 | 对普通文件 | 对目录 |
|---|---|---|
r读 | 读取文件内容,如cat | 查看目录中的文件名,如ls |
w写 | 修改文件内容,如vim、echo > | 修改目录项,例如创建、删除、重命名文件/子目录 |
x执行 | 允许把文件作为程序执行,如./a.out | 允许进入、访问该目录,如cd |
2.4 chmod
chmod 是Linux 中用来修改文件或目录权限的命令。
常用选项:
- R递归修改目录文件的权限。
2.4.1 chmod命令权限值的格式
用户符号
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
用户表示符 + / - / = 权限字符
+:增加指定权限-:取消指定权限=:直接设置为指定权限
2.4.2 代码示例
这里就只演示u +/-/=:
2.4.3 相关小知识
2.4.3.1 一次性修改多个角色权限
我们也可以一次性修改多个角色的权限,代码演示如下:
2.4.3.2 修改文件权限的限制
普通用户只能修改自己的文件权限;要么切换为超级用户 root,要么使用 sudo.
2.4.3.3 用户角色确定的唯一性
Linux 在判断普通文件的u/g/o权限时,身份匹配是有优先顺序且最终只选一类权限的:
先判断:是不是所有者? ├─ 是 → 只看 u 权限 └─ 否 ↓ 再判断:是不是属于所属组? ├─ 是 → 只看 g 权限 └─ 否 ↓ 最后看 o 权限2.4.3.4 root 权限不受控
root 用户不受权限的约束!!
2.4.3.4 可执行权限 != 可执行
可执行 = 可执行权限 + 本身就是二进制可执行文件
2.4.4 数字表示法
由于r=4、w=2、x=1,可将三类访问者的权限用 “三位八进制数字” 表示(所有者 + 所属组 + 其他用户),格式:chmod 数字权限 文件名。
2.4.4.1 代码示例
2.5 chown
chown 是 Linux 中用来修改文件或目录的所有者。
常用选项:
-R:递归修改文件或目录的所有者。
2.5.1 chown 使用注意事项
- chown 和 chmod 不同,普通用户不能随把目录\文件的所有者变为其他人,要么切换为超级用户,要么使用 sudo
- chown 也可以用来修改所有者和所属组(所有者变为lzx,所属组变为study),代码如下:
chown lzx:study ./test.txt2.6 chgrp
chgrp 是 Linux 中专门用来修改文件或目录所属组的命令
常用选项:
-R:递归修改文件或目录的所属组。
2.6.1 chgrp 使用注意实现
chgrp 和 chown 不同,在特定情况下不用切换为 root 或者使用 sudo:
这个文件/目录是你自己的,并且你想改成的目标组,是你自己所属的组之一。
2.6.2 代码示例
# 1. root将hello.txt的所有者改为zpw(普通用户无此权限) [root@bite-alicloud ~]$ chown zpw hello.txt [root@bite-alicloud ~]$ ls -l hello.txt -rw------- 1 zpw whb 29 Oct 22 20:56 hello.txt # 所有者从whb变为zpw # 2. 普通用户whb直接修改(无sudo,权限不足,报错) [whb@bite-alicloud ~]$ chown whb hello.txt chown: changing ownership of 'hello.txt': Operation not permitted # 3. 普通用户whb用sudo修改hello.txt的所有者为litao(需输入whb自己的密码,且whb已在sudoers配置中) [whb@bite-alicloud ~]$ sudo chown litao hello.txt [sudo] password for whb: # 输入whb的密码 [whb@bite-alicloud ~]$ ls -l hello.txt -rw------- 1 litao zhangsan 29 Oct 22 20:56 hello.txt # 所有者从zpw变为litao # 4. 修改hello.txt的所属组为zhangsan(需root或所有者) [root@bite-alicloud ~]$ chgrp zhangsan hello.txt [root@bite-alicloud ~]$ ls -l hello.txt -rw------- 1 zpw zhangsan 29 Oct 22 20:56 hello.txt # 所属组从whb变为zhangsan # 5. 假设whb是hello.txt的所有者,且属于zhangsan组(主组或附加组) [whb@bite-alicloud ~]$ chgrp zhangsan hello.txt [whb@bite-alicloud ~]$ ls -l hello.txt -rw-rw-r-- 1 whb zhangsan 29 Oct 22 20:56 hello.txt # 所属组从原组变为zhangsan # 6. 普通用户whb(此时他不是文件的所有者,且目标组不在自身组列表中)用sudo修改hello.txt的所属组为whb组 [whb@bite-alicloud ~]$ sudo chgrp whb hello.txt [whb@bite-alicloud ~]$ ls -l hello.txt -rw------- 1 litao whb 29 Oct 22 20:56 hello.txt # 所属组从zhangsan变为whb