Linux中Shell运行原理和权限(下)(4)

发布于:2025-02-27 ⋅ 阅读:(22) ⋅ 点赞:(0)


前言

  前几篇中有些指令我没有介绍,大家也可自行在CSDN搜索来扩充知识面!


一、Shell的运行原理

  我们都知道Windows以图形化界面为交互方式,而Linux以命令行界面为交互方式。Windows和Linux的交互方式虽然不同,但本质上是一样的,图形化界面和命令行界面都是为了让用户进行相关操作,而图形化界面和命令行界面就是我们所说的“外壳程序”。

在这里插入图片描述
  Linux严格意义上说是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户不能直接使用kernel,而是通过kernel的“外壳程序”,也就是所谓的Shell,来与kernel沟通。

Shell最简单的定义就是“命令行解释器”:

  1. 将使用者的命令翻译给核心(kernel)处理。
  2. 将核心的处理结果翻译给使用者。

  对比Windows中的图形化界面(GUI),我们操作Windows并不是直接操作Windows内核,而是通过图形接口,点击,从而完成我们的操作。Shell对于Linux具有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核,反馈结果再通过内核运行出结果,通过Shell解析给用户。

Shell运行原理:

  1. 创建子进程,让子进程进行命令行解释。
  2. 子进程出现任何问题,都不影响父进程Shell。

  对比到Windows当中就是,我们每运行一个程序就是创建了一个子进程,例如,登录微信、QQ。而这些子进程当中任何一个进程出现问题,都不会影响父进程,例如,当你的QQ出现卡死情况(程序异常)或你的QQ被关掉(程序终止),但其他子程序仍然可以运行。

在这里插入图片描述

注意: Shell只是所有外壳程序的统称,例如在centos 7当中的外壳程序名叫bash。

  或者我打个比方,如果说你是⼀个闷骚且害羞的程序员(比如我),那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你⼼动的MM⼩花。你看上了⼩花,但是又不好意思直接表⽩,那就让你你家⼈找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给⼩花,⽽我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使⽤的bash。

二、Linux当中的权限问题

Linux权限的概念

  在Linux下有两种用户,分别是超级用户(root)和普通用户。超级用户可以在Linux下做任何事情,几乎不受限制,而普通用户一般只能在自己的工作目录下(/home/xxx)工作,以及在系统上做有限的工作。换句话来说,所有的权限的概念都是用来限制普通用户的,而超级用户几乎不受限制。

超级用户的命令提示符是“#”。
在这里插入图片描述
普通用户的命令提示符是“$”。
在这里插入图片描述
如何实现用户账号之间的切换?

语法: su 用户名
功能: 用户切换。
从普通账号切换为root账号。
在这里插入图片描述

如何将普通用户添加到信任列表

首先你得先切换到超级用户,只有超级用户才有权力将普通用户添加到信任列表。

  1. 切换到超级用户后,我们使用vim打开文件sudoers进行添加。

在这里插入图片描述

  1. 添加如箭头标示的那一行

在这里插入图片描述

  1. 然后按ESC按键,并且接着 shift + : ,当下面出现 : 的时候再输入wq! + 回车结束

在这里插入图片描述

三、Linux权限管理

文件访问者的分类(人)

  1)文件和文件目录的所有者(文件拥有者)。
  2)文件拥有者所在的组的用户(文件所属组)。
  3)其他用户(other)。

请注意!对于某一文件而言,其拥有者、所属组和 other 就是由超级用户(root)和普通用户所扮演。在Linux当中,所有用户都要隶属于某一个组,哪怕这个组只有你一个人(此时该组就以你的用户名为组名)。

这个 组 的概念从何而来呢?请看下面例子:

在某个公司当中有两个小组团队(A组、B组)在同一个Linux服务器上进行着同一款项目的开发(赛马模式),而你就是A组当中的一员。

据我所知,赛马模式是腾讯很喜欢的一种模式

在这里插入图片描述

如果没有所属组的概念,那么当你创建了一个文件后,要么就是只有你自己(拥有者)能看到,要么就是其他人(other)也都能看到。而你所希望的是你自己和你的小组成员能看到,剩下的人看不到。

于是就有了所属组这个概念,这时你就可以将文件设置为拥有者和所属组可见,而other不可见。所以所属组的存在是为了更灵活的进行权限配置,满足团队协作

我们可以通过指令ll来查看某一文件或文件目录的拥有者和所属组。
在这里插入图片描述

注: 除了文件拥有者和文件所属组之外的都叫other。

文件类型和访问权限(事物属性)

权限涉及到某个具体的事物来说,我们还需要讨论事物本身的属性。对于文件来说,我们应该讨论其文件类型,以及是否具有可读、可写和可执行的属性。

使用指令ll,我们可以看到前面有一串字符,这串字符实际上就代表着该文件的类型和属性。

在这里插入图片描述
这串字符由10个字符组成的。其中第一个字符所代表的就是该文件的文件类型。

不同的字符代表不同的文件类型。
  1)-:代表普通文件。
  2)d:代表目录。
  3)l:代表链接文件(类似于Windows当中的快捷方式)。
  4)b:代表块设备文件(例如硬盘、光驱等)。
  5)p:管道文件。
  6)c:字符设备文件。
  7)s:套接口文件。

注意: 在Linux当中,文件类型与文件后缀无关。

剩下的9个字符每三个为一组,分别代表该文件相对于其拥有者、所属组以及other是否拥有某种属性。
在这里插入图片描述
每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个代表是否具有可写属性,第三个代表是否具有可执行属性。

在这里插入图片描述
若是具有可读属性,则第一个位置的字符为r;若是具有可写属性,则第二个位置的字符为w;若是具有可执行属性,则第三个位置的字符为x。若某一位置为字符 - ,则说明不具有对应位置的属性。

在这里插入图片描述
test.c文件是一个普通文件,该文件的拥有者对其是可读可写的,但该文件的所属组和other对其只有读的权力。

文件权限值的表示方法

a)字符表示方法

ll指令打印文件权限值时的表示方法就是字符表示法

在这里插入图片描述
b)八进制数值表示法

字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示

在这里插入图片描述

文件访问权限的相关设置方法

如何改变文件的访问权限

语法: chmod 选项 权限 文件名或目录名
功能: 设置文件的访问权限。
常用选项: -R 递归修改目录文件的权限。

在这里插入图片描述

如上图所示,我给 test.c 文件加上了可写可执行的权限

若要同时设置不同类用户的访问权限,则需用逗号隔开

在这里插入图片描述

如何改变文件的拥有者

语法: chown 选项 用户名 文件名或目录名
功能: 修改文件的拥有者。

注意: 修改文件的拥有者需要root用户进行操作,若是普通用户则需要进行权限提升

在这里插入图片描述

注意: 修改文件的拥有者需要root用户进行操作,若是普通用户则需要进行权限提升。

也可以使用chown指令同时修改文件的拥有者和所属组,将拥有者和所属组的用户名用冒号隔开即可

如何改变文件的所属组

语法: chgrp 选项 用户名 文件名或目录名
功能: 修改文件的所属组。

在这里插入图片描述

注意: 修改文件的所属组也需要进行权限提升。

如何修改文件的掩码

我们查看新建的文件和目录,它们都有自己默认的权限。

在这里插入图片描述

实际上,新建文件的默认权限为0666,新建目录的默认权限为0777。其中第一位的0与特殊权限有关,我们这里不必深究,而后面三位就是权限的八进制数值表示方法,我们将其翻译为字符表示方法

在这里插入图片描述
但实际上你会发现,你所 创建出来的文件 和 目录的权限值 往往不是我们所翻译出来的值,原因就是创建文件和目录的时候还要受到 umask 的影响

假设默认权限是mask,则实际创建出来的文件权限是:mask & (~umask)

语法: umask 权限值
功能: 查看或修改文件掩码。

在这里插入图片描述
因此我们实际创建出来的文件和目录的权限值还需要进行进一步换算才能得出。首先我们将掩码的的后三位八进制换算为二进制,然后对其进行按位取反

现在假设 umask 的掩码是 002
在这里插入图片描述
然后将之前的新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是我们创建出来的文件和目录的权限值

在这里插入图片描述
也可以理解为凡是在umask中出现的权限位,都不能在最终权限中出现。

在这里插入图片描述
因此我们也可以通过修改 umask 来设置文件的访问权限。

所以我们只要设置掩码为000,那么新创建的目录或文件就是默认权限 ;如果设置掩码为777,那么新创建的目录或文件就是无任何权限

目录的权限

  对于文件来说,其可读可写可执行的属性我们都知道分别代表着什么对应的操作,那对于目录来说可读可写可执行又分别代表着什么呢?

1)可读权限: 如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容。
2)可写权限: 如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件。
3)可执行权限: 如果用户没有该目录的可执行权限,则无法通过cd指令进入到目录当中。

那么这就会出现一个问题
  只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。

在这里插入图片描述

注意看该图,我们有当前目录的读写权限,却没有 test.txt 的读写权限,但是我们却成功删除了 test.txt

粘滞位

  为了解决这个不合理的问题,Linux引入了粘滞位的概念。

语法: chmod + t 目录名
功能: 给目录加上粘滞位

当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符 “t”。

在这里插入图片描述
此时另一个用户就算有该目录的可写权限,也无法删除该目录下的文件。

在这里插入图片描述

当一个目录被设置为粘滞位,则该目录下的文件只能由:
1)超级用户删除。
2)该目录的拥有者删除。
3)该文件的拥有者删除。

注意: 虽然目录被加上了粘滞位,但如果用户有该目录的可写权限,则不影响其在该目录下创建文件,只是对于删除会有影响!!!


总结

  开始上难度了!不过接下来的一篇会很有意思,我会教大家来实操如何在Linux环境下用命令行来提交你自己的代码到gitee/github