1 Xshell 运行原理
1.1 命令行的组成

命令行又由用户名、主机名和工作目录组成

"#" 是提示符,表明左边是操作系统的,右边是用户的。提示符分为两种:"$"(普通用户)和"#"(超级用户)。
1.2 外壳程序
实际上我们输出的命令行并不是操作系统给我们提供的功能,而是一个叫 “外壳程序” 的东西来给我们提供 读取命令、识别命令 的功能。"外壳程序" 打印出命令行,由该命令行进行我们对应的操作。

操作系统外壳往往会包裹一层软件层,我们将其称为外壳程序,外壳程序最直观的表现是给我们用户输出一个叫做命令行的东西,然后我们用户就可以输入命令。我们输入的命令如:「ls」 本质上是一串字符串,命令最终会交给外壳程序,外壳程序再将命令交给操作系统去执行,操作系统执行完后再通过外壳程序把对应的结果返回给用户,最后用户就看到「ls」 的执行结果。
我们将这个外壳程序称为命令行解释器,Linux 中命令行解释器统称为 shell
命令行解释器最直观的作用有两个:
- 将使用者的命令翻译给核心(kernel)处理
- 同时,将核心的处理结果翻译给使用者
我们讲个例子方便大家理解命令行解释器:
假如现在有个闷骚且害羞的程序员小王(用户),那 shell 就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的小花。小王看上了小花,但是有不好意思直接表白,那就让家人找媒婆帮他提亲,所有的事情小王都直接跟媒婆沟通,由媒婆转达小王的意思给小花。这相当于命令行解释器的第一个功能:翻译,以便用户进行操作。
小花多次拒绝了小王,小王你不死心还希望媒婆再争取一下。但这次媒婆在小花家窗外看见小帅和小花及其家人像一家人一样愉快的吃饭,这次媒婆连门都没进就和小王说没戏了,变相拒绝了小王的请求。这相当于命令行解释器的第二个功能:如果用户输入的指令太离谱,命令行解释器就直接拦住命令,不交给操作系统,以保护操作系统。
但小王还不死心,让媒婆再帮忙。因为小王他爸是村长,媒婆看在村长的面子上不好不帮。但是媒婆知道这事成不了,不想因此砸了自己的金字招牌,怎么办呢?于是媒婆招了一个实习生,让实习生去做。实习生做成了,是我慧眼识珠;没做成那也没影响。这相当于命令行解释器的第三个功能:外壳程序在系统上是以一个进程的方式去实现,外壳程序在进行命令行解释时不能挂,一旦他挂了就只能重新登录了。所以有新命令到来的时候,外壳程序往往都会创建一个子进程,让子进程去执行命令,如果子进程挂了,也不影响。
在ubunto 系统下,对应的命令行解释器叫:bath

那 bath 与 shell(外壳) 是什么关系呢?
相当于王婆与媒婆的关系
也就是说shell 是所有外壳程序的统称,而 bath 是某个具体的外壳程序
其实 Windows 操作系统对应的图形化界面也是一种外壳程序,我们鼠标的每一次点击都会由窗口操作转换为系统级别的任务,交给操作系统去执行。我们的手机系统安卓的底层也是 Linux,即操作系统内核是 Linux,但是他的外部程序是安卓,安卓是包裹在 Linux 外的一层 shell。
2 Linux中的用户
2.1 两种用户
在 Linux 中是否有权限是对用户而言设置的,Linux 中用户有哪些呢?
Linux下有两类用户:超级用户(root) 与 普通用户
- 超级用户:可以在 Linux 下作任何事情,不受限制
- 普通用户:在 Linux 下作有限的事情
- 超级用户的命令提示符是 “#”,普通用户的命令提示符是 “$”
root 用户的权限非常高;而普通用户的权限低、受管控
2.2 创建普通用户
我们首先先来学习创建一个普通用户
指令:「 adduser」与「 passwd」
创建普通用户: 语法:「adduser」 [选项] 用户名

- 设置密码 语法:「passwd」 用户名 也有些系统创建用户后直接让你输入密码,不需要该行指令

接着输入两次新密码即可, 注意:Linux下输入密码不回显!

删除用户 语法:「userdel」 -r 用户名
删除用户这里就不演示了,需要注意的是一定要加上 -r ,不然系统会出问题!
如何查看我们创建的用户呢?Linux 中创建的用户都是放在 home(家) 目录中的,我们只需要将目录切换到 home(家) 目录查看即可。

2.3 用户切换
2.3.1 普通->超级
我们先来讲普通用户如何切换至超级用户
直接使用 「su」 命令 即可
回车之后,系统要求我们输入密码

此时一个输入普通用户的密码还是超级用户的密码呢?
肯定输入的是 root 的密码。现在是从普通用户转换成 r o o t root root 用户,要是输入普通用户的密码,不人人都能成为 r o o t root root 用户了。这也就是说想要切换成 r o o t root root 用户,你必须是管理员。
同样,这里的密码输入是不回显的
回车之后就切换至 r o o t root root 用户啦:

同时,用「su」 命令指令从普通用户切换至超级用户,所处的路径不改变

此外 普通用户变超级用户还有一种做法
指令:「su」 -
「su」- 与 「su」 的操作方法一模一样,这里就不再演示了,我们来看看他们有什么区别

区别就是:「su」不会让 root 重新登录,只是身份的切换,最直观的表现就是他不影响我们当前所处的工作目录;而「su」 - 让我们以 root 身份重新登录一次,它会导致我们用户当前用户所处的路径发生变化
2.3.2 超级->普通
超级用户变成普通用户也是用「su」命令
语法:「su」 用户名 / 「su」 - 用户名

超级用户变普通用户是不需要输密码的。为什么呢? root 是最高权限,用户的密码挡不住 root, root 想干嘛就干嘛。
这里加不加 「-」 的区别与上述是一样的,就不再赘述了
3 指令的短暂提权
3.1 为什么要提权
假设我们现在只是普通用户,但现在我需要以超级管理员的身份去执行一条权限级别比较高的命令:比如安装软件,安装软件其本质就是将自己对应的指令写入到特定的目录下(/user/bin目录)而该目录往往是属于 root 的,普通用户没有权限拷贝。那怎么办呢?这时就需要进行权利的短暂提升。
这里顺便说一下,Linux 中安装的所有的程序其实只安装了一份,这不过安装的这一份允许大家同时使用。比如普通用户能用「ls」,root 用户也能用「ls」(也有少部分指令(adduser)禁止普通用户使用)

权限被拒绝
3.2 sudo 指令
短暂提权用到的指令是:「sudo」
- 语法:「sudo」 要执行的命令
- 功能:进行指令的短暂提权
如:我们以 root 的身份创建一个文件

文件就创建好了

此时虽然我们还不会看文件的具体属性,但是这个文件属于 root 还是能够看出来的
「sudo」第一次输入需要密码,之后会有十到十五分钟的免密码使用
我们可以看到「sudo whoami」识别出来的用户身份是 root

3.3 人人都能提权吗
像上面,普通用户只要用 「sudo」就能变成 root 用户(输的是普通用户的密码而不是 root 用户的密码),那这样岂不是人人都是 root 用户了?那 root 用户不形同虚设吗,还区分普通用户和 root 用户干嘛
其实我们正常普通用户输入「sudo」 指令 会报错的

什么原因呢?
Linux 系统会提供类似白名单的东西,只有在白名单上的用户才能用 「sudo」 进行提权。
白名单就是无条件相信,与黑名单无条件拒绝相对应
在默认情况像 Linux 系统是不允许普通用户去执行「sudo」的,要执行必须将当前用户添加到一个类似于白名单的东西。白名单路径如下:/etc/sudoers

可以看到这个白名单是属于 root 的,只有超级用户才有资格修改。
如果想要普通用户执行「sudo」,必须用超级管理员的身份修改 sudoers 配置文件
修改方式如下:

注:推荐用 vim 编辑器打开
那可能又有小伙伴问:那我只要把我自己加到 sudoers 文件上,不还是能随便提权吗。
其实在公司中,假设一个小组 10 人共用一台机器,只有一个是人是管理员。如果你想将自己的用户加入sudoers 中,必须线下真人去争得管理员的同意才行。现在我们能自己修改 sudoers,那是因为我们现在既是用户又是管理员。只要要线下去找管理员,说明人家是真正认可你的,所以不用担心人人都是 root 的问题,即便是白名单中的root ,那也是值得信任的。












