⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

时间:2022-10-21 09:53:34

???? 前情提要????

本章节是Linux操作系统的解压缩操作&shell外壳程序&权限相关概念及其操作的相关知识~

接下来我们即将进入一个全新的空间,对操作系统(系统层面)等相关知识有一个全新的视角~

以下的内容一定会让你对Linux有一个颠覆性的认识哦!!!

以下内容干货满满,跟上步伐吧~


作者介绍:

???? 作者: 热爱编程不起眼的小人物????
????作者的Gitee:代码仓库
????系列文章&专栏推荐: 《刷题特辑》《C语言学习专栏》《数据结构_初阶》《C++轻松学_深度剖析_由0至1》

????我和大家一样都是初次踏入这个美妙的“元”宇宙???? 希望在输出知识的同时,也能与大家共同进步、无限进步????
????这里为大家推荐一款很好用的刷题网站呀????点击跳转



????本章重点

  • 认识文件“打包”概念&解压缩操作

  • 分析Linux操作系统底层结构

  • 理解“外壳程序”概念

  • 理解Linux下权限概念&操作

    • 基本认识用户、事物的基本属性概念

    • 了解面试常见题:权限

    • 了解并认识权限掩码概念

    • 了解并认识粘滞位的概念&操作


????一.打包和压缩

????打包和压缩:

  • 从字面意思我们便可知:

    • 打包:就是将所以东西放在一起

    • 压缩:就是在打包后的基础上,压缩它的存储空间

  • 而我们之所以需要 打包&压缩 操作,是因为这样有利于 文件传输(归档)

  • 从此我们也可以知道:下载软件的时候,下载下来的是一个压缩包

➡️对于Windows系统来说:

  • 我们可以经常可以在图形化操作系统下看见各种后缀的压缩包,代表着市面上有许多的解压缩软件厂商,它们都是通过不同的压缩算法对文件进行压缩

  • 那对于Linux操作系统来说,是否也存在解压缩工具呢?答案是肯定的,在Linux下也如此

????接下来我们深入了解Linux下的文件解压缩的知识吧~


????Ⅰ.zip/unzip指令

1️⃣基本语法:

  • zip ➕ [选项] ➕ name(压缩后文件的名字).zip ➕ 要压缩的文件/目录

  • unzip ➕ [选项] ➕ name.zip ➕ 不写默认执行到当前路径[-d + 指定路径:解压到指定路径]

2️⃣指令功能: 将目录或文件压缩成zip格式

⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

3️⃣ 常用选项:

  • -r:递归进行处理,将指定目录下的所有文件和子目录一并处理

    简单来说:只有输入选项-r,才会将指定目录下的所有文件、目录一并打包压缩,否则目录下的任何东西其实并没有被压缩

    从上图中压缩时候只有adding:myfile可看出只压缩了一个目录,并没有将myfile目录下的所有文件给压缩起来,但是下图就可以很清晰看见是将其目录下的所有子文件、子目录全部压缩起来

    ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

????补充:

  • 一般建议建文件名加上.zip这样的格式后缀,但是也是允许用户自己起一个档名的

????Ⅱ.tar指令

1️⃣基本语法:

  • tar ➕ [参数] ➕ name(打包/压缩后文件的名字) ➕ 要压缩的文件/目录

  • tar ➕ [参数] ➕ 要解压的文件/目录 ➕ 不写默认执行到当前路径[-C + 指定路径:解压到指定路径]

2️⃣指令功能: 将指定的文件/目录打包、压缩

3️⃣ 常用参数:

  • -c:建立一个压缩文件的参数指令(create 的意思)【即将准备进行压缩的文件进行打包到一个文件的操作】

  • -x:解开一个压缩文件的参数指令

  • -z:表示开始执文件行压缩/解压操作【同时具有两种属性】

  • -v:表示显示压缩过程

  • -f:档名,表示将执行操作(打包/压缩)后的文件将都归入此文档中

????补充:

  • 通过tar指令进行打包后的文件名一般将其后缀设为.tar,而打包并压缩后的文件名后缀格式一般设为.tar.gz

    • .tar表示的是打包

    • .gz表示的压缩

  • 打包并压缩后的文件后缀可以由.tar.gz缩写成.tgz

  • 一般建议建文件名加上上述提及的格式后缀,但是也时允许用户自己起一个档名的

特别注意:

  • -v选项为非必要参数,但建议加上,在压缩时间过长的时候方便我们查看原因

  • 但是此参数不建议用在背景执行过程

????举个例子:

  • 1️⃣打包操作

    ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

  • 2️⃣压缩操作

    ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

  • ⭐通过上述两个例子中,我们不难发现:

    • 在示例一中,文件执行操作后的大小并没有减少,可以侧边印证这是打包操作

    • 在示例二中,文件执行压缩操作后,文件的空间大小大大减少了


????二.uname指令

1️⃣基本语法: uname ➕ [选项]

2️⃣指令功能: 查看当前Linux下的体系结构(即计算机版本)和内核版本

3️⃣ 常用选项:

  • -a:返回系统内核、系统版本等所有信息

  • -r:专门查看Linux的内核版本

    ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

????三.剖析“外壳程序”

????外壳程序:

  • 在详细了解外壳程序前,我们先回顾一下上篇文章所提到的 "Linux下一切皆文件" 的概念

  • 本质:在Linux操作系统的视角看来,真正的系统硬件底层被一层软件给封装管理起来了,即我们只能看到经过软件封装管理后硬件底层被包装成“文件”的样子,这也就是为什么我们用户在基于Linux操作系统下的所有操作就像在操控文件一般

  • 但是,我们如今的所有操作,好像都是基于命令行或者图形化界面上的:

    • 那我们作为用户究竟是如何访问操作系统❓

    • 我们所操作的命令行或者图形化界面究竟是什么❓

➡️引入概念:

  • 在解决上述问题前,我们需要先建立一个概念: 我们作为用户(有不同年龄段,不同知识层面……)都是 不善于直接使用操作系统

    • 不仅仅是因为操作系统使用起来复杂,难懂晦涩

    • 而且是因为用户的不确定的性、多样性,操作系统的设计无法满足让所有人去使用

    • 即如果想让所有人都会使用操作系统,则:

      • 操作成本会变得特别高

      • 人会犯错,会给操作系统带来不安全、不确定因素

  • 所以,基于上述的问题,我们便可知:操作系统并不是开放给所有人使用的,而是针对特定的少数的人群去使用的

  • 这也就是为什么,我们用户在操作图形化界面或者命令行的时候,其实 操作的并不是操作系统

????有了以上的概念,我们便可以回答上述的两个问题了:

  • 本质:用户实质操作的是操作系统所提供的外壳程序,即我们所有的操作其实都是在和外壳程序交流的

⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

  • 通过上图我们就可以了解到,其实前面所提到的 “Linux下一切皆文件” ,本质作为用户的我们并不是可以直接操作的了这些 “文件”

  • 还是需要和外壳程序进行沟通交流,经过外壳程序的判断后,由外壳程序去正确地调度操作系统内的对应的功能,再由操作系统层层往下调度硬件驱动、硬件,直至达到我们想要的功能

????举个例子:

⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

  • 就如上述操作一下,我们输入指令:Dream-Y.ocean,其实并不会直接跟操作系统进行判断此条指令的可执行性

  • 而是先传达给bash(外壳程序),再由bash传达给操作系统

    • 若操作系统不认识此命令,就会返回传达命令无效的信息,再由bash打印出错误信息,来传达给我们告知我们命令无效

    • 若操作系统认为此命令有效,就会调用相对应的操作

补充:

  • shell是对所有外壳程序的总称

  • bash是众多外壳程序中其中一个具体的外壳程序

综上,:

外壳程序存在的意义:

  • 外壳程序相当于游走在用户和操作系统之间,解析并传达双方之间的指令,是用户和操作系统交互中间软件层

  • 可以在一定程度上,起到保护操作系统的作用

但是有时候即使我们输入的指令正确,也会存在执行不了的问题:

  • 第一种:在外壳程序层面就直接拒绝我们的请求,这种行为,相当于变相的保护了操作系统

  • 第二种:在操作系统层面拒绝我们的请求,即 指令存在,但指令并不能执行 【这里就涉及到权限的概念,后续会详细讲解】

????接下来我们深入了解Linux下的权限概念&操作的知识吧~


????四.权限管理

????Linux权限管理:

  • 1️⃣权限是什么:

    • 权限是针对人的、事物的基本属性所决定权限相关的概念的

    • 简单来说:文件权限就相当于一件事情是否允许被我们去操作

  • 2️⃣即权限是由两部分组成的:事物的基本属性 ➕ 人的基本属性

⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

  • 事物的基本属性:是决定权限相关概念的核心基础,即我们如果想要访问某个文件,前提得是这个文件(事物)得具备被访问的属性,如果事物本身的基本属性就不具备这个功能,就轮不到人的基本属性去决定此事物的权限了

    【其中事物的基本权限有:读(r)、写(w)、执行(x)】

  • 人的基本属性:在事物拥有了相关基本属性后,才由人的基本属性去查看是否有权限去对事物执行相关操作

????举个例子:

⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

➡️由上述可知:

  • 1️⃣红色部分圈住的为:表明该文件的文件类型

    • -d:表示此文件的文件类型为目录文件

    • -:表示此文件的文件类型为普通文件

    • -p:表示此文件的文件类型为管道文件

    • -b:表示此文件的文件类型为块设备

    • -c:表示此文件 的文件类型为字符设备

  • 2️⃣绿色部分圈住的为:文件所属身份类别的用户名,一共有下述三种类别:

    • 从左往右显示的第一个为拥有者的用户名(表示该文件属于谁)

    • 第二个为所属组的组名(表示该文件属于哪个组)

    • 如果用户都不符合上述的两种类别中的一个,那就属于other

      ????如何理解Linux文件下的所属组:

      即如果我们没有所属组的概念的话,就相当于在Linux下“人”的身份就只剩下拥有者和other,即此时只有文件的拥有者拥有对文件相关操作的权限

      如果存在某一个oher 身份的人也想查看此文件的话,就只有唯一一个办法就是开放other身份对文件的阅读权限,也就代表着所有other身份的人都可以查看此文件【即对文件全公开了】,那就违背了我们只想开放给一个other身份的用户查看此文件的初衷了

      所以所属组存在的最大意义就在于: 对于特定文件的权限可以实现组内管理,让同一个组的人可以实现对文件的相关操作

  • 3️⃣黄色部分圈住的部分正是:表示不同身份所对应着的文件的权限

    • 这部分将以3个字母为一组去匹配对应的身份,从左往右依次对应的是:拥有者、所属者、other

    • 如下图所示:

      ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

特别注意:

  • other身份并不会显示出来,因为已经限定了拥有者和所属组两种类别,一旦都不满足,就自动属于other身份了

  • 每一个身份匹配的文件权限有对应的三个字母表示,且文件权限的字母顺序(顺序为:r、w、x)是绝对的

  • 如果该身份没有某个对此文件进行操作的权限,则相应权限的字母位置上则为-

综上:

  • 我们已经基本解了Linux下的文件权限的全部概念啦~

  • 经过上述讲解,我们还可以知道如果想对文件执行某一权限的操作,即修改权限操作,我们有两种方法:

    • 修改事物的基本属性:保持用户的身份不变,修改文件对应身份的对应权限,使当前身份可以进行此权限的操作

    • 修改人的基本属性:保持文件原有的权限属性不变,更改身份为拥有对文件执行某一权限操作的权限的身份,进而可以对文件执行相应操作

????那我们就进一步深入上述的两种方法使如何实现的吧~


????Ⅰ.用户管理

????用户管理:

  • 在Linux下存在两种用户:

    • 超级用户(root):只允许存在一个超级用户,但具有Linux下的最高权限,一般不受(权限)限制

    • 普通用户:可以由多个用户,但在Linux下只能做有限的事情,受权限的限制

➡️身份切换:

  • 1️⃣基本语法: su ➕ [用户名]
  • 2️⃣指令功能: 切换用户身份
  • ????身份切换的本质: 权限的改变

特别注意:

  • 在身份切换的时候,如果是root用户切换成某一个普通用户,可以直接su 用户名即可切换

  • 但对于普通用户切换成root用户,则需要输入登录成root用户对应的密码

    【即切换成哪个身份,则需要输入登录这个身份所需的密码】

  • 即因为root具有Linux下最高权限,所以可以随意切换用户且不需要输入密码,但是普通用户则不行


????Ⅱ.用户属性管理

????用户属性管理:

  • 即我们可以修改文件的拥有者、所属组

➡️用户属性更改:

  • 1️⃣基本语法: chown/chgrp ➕ [用户名字] ➕ 要被修改的文件名
  • 2️⃣指令功能: 更改此文件的拥有者、所属组

特别注意:

  • 修改一个文件的所属者的时候,如果我们使普通用户,我们是无法直接修改的,即同级别用户下无法直接修改

  • 就好比我给别人一样东西,需要先征得别人的同意先,我才给得出

  • 将文件的身份改回来回来有如下两种方式:

    • root用户强制修改

    • sudo chown/chgrp ➕ [用户名字] ➕ 要被修改的文件名,sudo在这里表示在执行当前指令的时候 临时提升权限【即临时提升为root权限去执行此条指令,效果和第一个方法相同】

    • 但是对于后续指令执行的身份都是原身份,这也就是为什么说只是 临时提升权限

  • 如果用户想执行sudo,提升权限,需要该用户在信任列表中,才可以执行sudo【添加用户到信任列表是需要root身份的】

  • 我们查看某一个用户对于某个文件身份的时候,我们只需要看一个符合、满足自身的自我权限就行,因为权限仅会被认证一次,一旦认定你是属于拥有者or所属组,就只需要看那个身份对应的权限即可,哪怕同时多个身份都满足,也不需要看了

????Tips:

  • 如果想同时修改拥有者和所属者的用户的话,可以直接一条指令解决:sudo chown 修改拥有者:修改所属组 文件名

????Ⅲ.事物属性管理

????事物属性管理:

  • 即我们可以修改文件的某一身份的某一权限

➡️文件属性更改:

  • 1️⃣基本语法: chmod ➕ [身份] ➕ [(+/-)要修改的权限字母] ➕ 要修改权限的文件名
  • 2️⃣指令功能: 更改文件中的某个身份的某个权限

特别注意:

  • 身份包括:拥有者(u:user )、所属组(g:group)、other(o:other)

  • 如果想增加某个权限,就使用+ 某个权限的英文

  • 如果想删除某个权限,就使用- 某个权限的英文

????举个例子:

⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

  1. 我们想让拥有者身份对此文件有执行文件的权限,即x权限

    那此时就可以使用chmod u+x test.c指令

    ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

  2. 同理,如果我们想删除拥有者身份对此文件有执行文件的权限,即x权限

    那此时就可以使用chmod u-x test.c指令

    ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

????Tips:

  • 如果想对多个身份的权限都进行修改,我们可以将多条修改指令的操作结合成一条指令去使用:chmod u+x,g+x,o-r test.c
    ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

  • 如果想对多个身份的同一权限增减/删减某个权限的时候,我们可以a+/-某个权限【这里a表示all,全体身份】,Eg:chmod a+x test.c

    ⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

特别注意:

  • 修改文件权限只有这三个身份能做到:root用户、拥有者、所属组成员

????Ⅳ.面试题:权限

????常见权限面试题:

  • 1️⃣进入目录需要的权限是:X(执行权限)

  • 2️⃣查看目录下面的文件列表需要的权限是:r(读权限)

  • 3️⃣在文件目录下想创建一个文件/目录需要的权限是:w(写权限)


????Ⅴ.权限掩码

????权限掩码:

  • 权限掩码的作用就是:限制权限(对应着权限控制的八进制位数字)

  • 最终权限(默认权限) = 起始权限 & (~umask)

  • 补充:因为权限一共有三组,共9个字符,我们便可以用9个二进制1表示权限都开启,二进制0表示其中某一个权限关闭,又因为权限的位置是固定的,便可以将三个为一组(一个身份)的权限统一看待,即将3个二进制变为1个八进制数字去表示一共身份的权限状态

????举个例子:

⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性

  • 在Linux下,为什么我们创建一个文件/目录时,不同身份之间的默认权限存在差异性呢?【如上图中:目录文件的默认权限比普通文件的默认权限多了个x(执行权限)】

  • 这正是因为:收到权限掩码(umask)的影响,从而最终权限(默认权限)不一样

    • 一个目录文件被创建,起始权限是从777开始的

    • 一个普通文件被创建,起始权限是从666开始的

  • Eg:对于目录文件来说,权限掩码(umask)为002,经过算式计算后可发现,最终权限(默认权限)就是我们所看见的775

特别注意:

  • 起始权限并不等于默认权限,默认权限是起始权限经过权限掩码的控制并经过计算后,变为我们最终所看见的最终权限

????五.粘滞位

????粘滞位:

  • 虽然我们可以通过修改读写权限去限制用户的阅读、修改文件的权限

  • 但是对于某种特殊场景下:多个用户需要协同合作,在同一个目录下维护多个文件的时候【即一般在root的根目录下,创建了个权限为777的目录文件,这样其他other用户也可以进入此目录进行读、写、执行权限】,用户自己并不能通过修改自己的文件权限而阻止别的用户误删自己的文件

  • 此时就可以运用到粘滞位,使整个目录下的所有文件达到只允许文件拥有者自己去删除,而其他用户删除不了的效果

这是为什么呢

  • 首先,我们先分析一下文件可以被删除的原有:

    • 正是因为文件被删除的能力根本不是受文件本身的权限所决定的

    • 而是看文件所在的目录文件是否具有w(写)权限【所以导致自己的文件可以被别的用户进行删除的主要原有也是因为该目录具有w权限,因为在此目录下进行创建文件和删除文件都是根据此目录文件的w权限去决定的,而不是看创建后的文件的w权限】

  • 所以为了达到多个用户可以共享同一个目录进行读、写、创建删除文件,且只能用户自己删除自己的文件,而不能删除别人的效果

  • 我们可以运用粘滞位t权限):运用chmod +t 要添加粘滞位的文件名指令(将此文件的other身份的w权限变为t权限)就可以使其文件下的所有文件都达到上述效果啦

特别注意:

  • root用户是不受任何任何权限影响的,所以当然也不受粘滞位的影响

  • 粘滞位只能给other身份设置,因为这是专门适配上述的特殊情况而设置的,所以一般创建共享目录的是root用户,所以其他人都是other身份,这也就是为什么粘滞位会自动给otherw权限变为t权限

  • 一个目录被设置为粘滞位,则该目录下的文件只能由:

    1. 超级管理员(root)删除

    2. 该目录的所有者删除

    3. 该文件的所有者删除

      方法2之所以可以删除,因为他们看的并不是目录文件的other权限,所以并不受粘滞位的影响,因为自己就是目录的所有者,所以看的是该目录文件的所有者的权限,固然就可以进行删除


????结尾

综上,我们基本了解了Linux中的 “解压缩操作&shell外壳程序&权限相关概念及其操作” ???? 的知识啦~

恭喜你的内功又双叒叕得到了提高!!!

感谢你们的阅读????

后续还会继续更新????,欢迎持续关注????哟~

????如果有错误❌,欢迎指正呀????

✨如果觉得收获满满,可以点点赞????支持一下哟~✨

⌈Linux_感受系统美学⌋ 一步一步迈向系统底层 - 寻觅Linux奥秘,探寻Linux下权限管理&周边属性