【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)

文章目录

  • shell外壳程序
    • 用户为什么不是直接使用操作系统
    • 用户如何访问的操作系统
    • Shell外壳程序是什么
    • 外壳程序存在的意义
    • 查看当前使用的shell外壳程序
  • 权限
    • Linux下的用户
    • 用户切换
    • 权限是什么?
  • Linux权限管理
    • 查看文件属性
    • 文件访问者的分类(人属性)
    • 文件类型和访问权限(事物属性)
    • 文件权限值的表示方法
    • 对文件权限的修改(两种方法)
    • 对文件拥有者和所属组的修改
  • 常见权限问题
    • 目录权限
    • umask
      • 设置umask
    • 粘滞位

shell外壳程序

用户为什么不是直接使用操作系统

我们平时在使用Windows的图形化界面或者在Linux下进行敲命令,是在直接使用操作系统吗? ----- 并不是

首先我们知道对于计算机的体系结构是这样的:

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第1张图片

操作系统:管理好下层软件,并且给上层使用者提供良好的执行环境

操作系统的功能是很复杂的,所以如果让人直接访问使用操作系统,是不合适的。

原因:

  1. 对用户是不友好的,因为用户是不善于直接使用操作系统,用户需要对操作系统很熟悉才可以使用的得当。
  2. 如果让人直接访问操作系统:
    1. 操作成本高(需要学这,学那才可以使用)
    2. 当用户犯错的时候,会带来不安全的因素(操作系统崩了,整个计算机也就崩了)

就比如

银行直接让所有人存取钱的时候自己操作所有的过程,银行的金库也是暴露在所有人面前的。这时候首先人需要会操作银行的机器,并且如果有人有坏想法,想把金库中的钱转到自己账户会带来十分大的安全因素。


所以,基于以上原因,系统的设置者并不会让人直接操作 操作系统

用户如何访问的操作系统

既然我们平时在使用Windows图形界面和在Linux下敲击各种命令都不是直接使用操作系统,那么我们是如何与操作系统进行交互的呢?

Windows下:通过图形接口,点击,从而完成我们的
操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)

Linux下:敲出某个指令,然后返回结果(如敲出ls,则显示出目录下的文件)

其实,用户访问操作系统是通过一个“间接人”的方式来访问操作系统的。就相当于一个“媒婆”。而这个媒婆就是外壳程序,Windows图形界面和Linux的命令操作其实就是操作系统提供的外壳程序。

Shell外壳程序是什么

Linux实际上就是一个操作系统,我们叫做"kernel", 一般用户不可以直接使用kernel,而是通过“kernel”的外壳程序,也就是shell来与kernel沟通。

shell的简单定义命令行解释器

  • 将使用者的命令翻译给核心 (kernel) 处理
  • 同时,将核心的处理结果翻译给使用者

外壳程序存在的意义

外壳程序存在的意义是什么呢?

  1. 是用户和操作系统交互的中间软件层
  2. 在一定程度上起到保护操作系统的作用,拒绝用户的一些非法或者不合理的请求

其实外壳程序并不是自己去和操作系统交互,而是派生子进程去进行交互

所以其实 计算机的体系结构是这样的:

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第2张图片

查看当前使用的shell外壳程序

echo $BASH

结果:/usr/bin/bash 这其实就是一个文件

bash就是CentOs中的shell外壳程序。shell就是对外壳程序的统称

shell就相当于媒婆这个职业,bash就是某个媒婆,如王婆

权限

Linux下的用户

root:超级用户,只有一个。具有Linux下最高权限,无权限限制(管理员)

普通用户:普通用户可以有多个,并且受权限的限制

root用户的命令提示符为 #

普通用户的命令提示符为$

Linux 下可以同时存在多个用户,所以Linux是一个多用户的操作系统

用户切换

两种写法:

su username

su - username

两种写法的区别:

- 选项 它代表切换用户身份时,用户的环境变量以及工作目录也要切换成新用户的环境变量和工作目录。环境变量是用来定义用户的操作环境的,如果环境变量没有随用户身份切换,那么很多操作将无法正确执行。

root切换为普通用户

su username 或者 su - username

普通用户切换为root用户

susu -su rootsu - root

普通用户切换为普通用户

su usernamesu - username

注意

  • 普通用户之间切换以及普通用户切换至 root 用户,都需要知晓对方的密码,只有正确输入密码,才能实现切换
  • 从 root 用户切换至其他用户,无需知晓对方密码,直接可切换成功。

其实root和普通用户就是Linux下真正存在的账号

权限是什么?

权限是什么:

我们可以说,我对这个文件具有读的权限

但是如果这个文件如果本身就不可读,那么即使我们的权利很大也没有对这个文件的读的权限,因为这个文件本身就没有读的属性。

有两个方面

  1. 事物本身具有的属性
  2. 人是否有权利去做

即权限的核心 = 人 + 事物属性

Linux权限管理

查看文件属性

ll命令,可以查看文件的各个属性

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第3张图片

其中,ll显示的第一列的第一个字符表示 改文件的文件类型

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第4张图片


补充:Linux下不以文件后缀来区分文件类型

只要你是一个可执行文件(.out文件),即使把后缀改为.txt

也可以执行,或者把后缀改为无 也可以执行

而Linux下就根据 上图中的第一列 区分文件类型

常见文件类型:

d表示目录文件

-表示普通文件

p表示管道文件

b表示块设备,如磁盘设备

​ 查看块设备:第一个字符以b开头【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第5张图片

c表示字符设备,如键盘或者显示器

​ 查看字符设备:第一个字符以c开头

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第6张图片

l表示链接文件:类似于 Windows中的快捷方式

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第7张图片

如图中就是建立了一个链接文件a.link指向可执行程序a

不过 此时文件中并没有创建a 这个可执行文件,所以就是红色

关于文件类型可以通过ll查看第一列来查看

注意

  • Linux下 不以文件后缀来区分文件类型, 不代表不可以使用,因为后缀名在系统层面没意义,但是对用户有用,可以方便用户区分文件类型。

  • 只是Linux系统下不以文件后缀来区分文件类型,但是在别的环境下不是这样的!

    比如用gcc编译某个写好的.c文件,如果改为.txt是不可以被识别的,这是因为gcc是Linux下的一个软件,gcc != Linux系统


文件访问者的分类(人属性)

文件的权限有两方面:人 和 文件的本身属性,文件访问者就是所谓的人,也就是访问者有什么权利

  1. 文件的拥有者:文件属于谁
  2. 文件的所属组:文件属于哪一个组
  3. other:不属于上面两种的任何一个,就是other
  • 关于拥有者,一般就是文件的创建者
  • 关于所属组,比如你在开发小组A里面工作,你敲了一份代码叫test.cpp,该文件的拥有者是你,如果Linux的权限只有拥有者和other,那么当小组A的组长(你的上司)想看代码的时候,他也属于other,如果想让组长看,必须让文件对other也公开,这样就让你的竞争对手看到了。所以需要所属组这个权限
  • 关于other,Linux不会标记,只要不是拥有者和所属组就是other

文件的拥有者、所属组、other是一种角色(身份),每个用户都可能是其中的一个身份,用户就是具体的人

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

文件属性中的文件权限部分:

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第8张图片

每一个文件,都有三个身份的权限表示

每一个身份,有三个位 表示其权限都有什么

顺序固定:第一个位置为r权限,第二个位置为w权限,第三个位置为x权限

其中 r表示读权限,w表示写权限,x表示执行权限,-表示无该权限

如果有该权限,对应位置就写上该权限的缩写r/w/x

如果没有,就用-表示该位置的权限情况

以上图为例 :

  • 拥有者为rwx,表示文件的所有者具有 读权限、写权限、执行权限
  • 所属组为r-x,表示文件的所属组具有读权限、执行权限,没有写权限
  • other为r-x,表示other具有读权限、执行权限,没有写权限

如何表述一个文件的权限?

根据文件的权限的表示行

该文件的拥有者具有 xxx xxx 没有xxx

该文件的所属组具有 xxx xxx 没有 xxx

该other 具有 xxx xxx 没有xxx

文件权限值的表示方法

1.字符表示方法

字符表示方法就是 我们利用ll显示出来的那样的权限表示

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第9张图片

2 .八进制数值表示方法

因为

  1. 权限的顺序是固定的:r w x

  2. 每一个位置 要么就是有该权限,要么就是没有该权限(只有两种状态)

所以我们可以用 1 表示该位置有该权限,0 表示该位置没有该权限,这样就可以利用三个二进制数 表示某个身份的权限了

而 3个二进制数 可以转化为一个8进制数,所以就可以利用9个二进制数,也就是3个八进制数表示 一个文件三个身份的权限都有什么

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第10张图片

举个例子,如果某一个文件的权限是rwx r-x r-x

那么用二进制表示权限:111 101 101

八进制表示权限:7 5 5

对文件权限的修改(两种方法)

chomd [参数] 权限 文件名

对应文件权限的表示方法,文件权限的修改也有两种方法

1️⃣ 字符修改:ugo 与 + -

权限更改

  • +::向权限范围增加权限代号所表示的权限
  • -:向权限范围取消权限代号所表示的权限
  • =:向权限范围赋予权限代号所表示的权限

用户符号

  • u:拥有者
  • g:所属组
  • o:其他用户(other)
  • a:所有用户

#给单身份添加单个权限

给拥有者 添加执行权限:

chmod u+x test.c

给所属组去掉读权限:

chmod g-x test.c

#给单身份添加多个权限

给拥有者 去掉读写权限:

chmod u-rw test.c

给other去掉所有权限:

chmod o-rwx test.c

给拥有者添加所有权限

chmod u+rwx test.c

#给多个身份修改单个权限

给拥有者 添加读权限,去掉执行权限:

chmod u+r,u-x test.c

给拥有者去掉读权限,所属组添加写权限

chmod u-r,g+w test.c

#给多个身份修改多个权限

拥有者去掉写和执行,所属组去掉执行,other添加读和执行

chmod u-wx,g-x,o+rx test.c

#给所有身份修改权限

给所有人去掉读权限

chmod a-r test.c

2️⃣八进制数字修改:3个八进制数字的组合

​ 每一个身份具有三个权限,三个权限中每一个权限都有 0 和 1两个状态,0表示无此权限,1表示有此权限。三个二进制数字组成一个特定的八进制数,表示一个身份的权限情况

一共有三个身份,所以只需要有三个八进制数 就可以设置所有身份的权限了

rwx rwx r-- 对应 111 111 100 对应 774

#给所有人 所有权限

chmod 777 test.c

#去掉所有人的所有权限

chmod 000 test.c

#给所有人只设置读权限

顺序是 r w x ,只有读权限对应: 100 即八进制 4

每个人都只有读,所以每个身份的权限值都是 4

chmod 444 test.c

#拥有者读写,所属组只有读,其他人无权限

chmod 640 test.c


没有权限会带来什么问题?

如图所示:

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第11张图片

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第12张图片

注意 root不受权限控制 即使没有权限 也可以进行操作

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第13张图片

root作为other 甚至可以把人家的文件的权限给改了

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第14张图片


对文件拥有者和所属组的修改

注意:

需要在root下操作(强制命令),或者在执行的命令前面加 sudo ,否则需要输入对方的密码 并且系统也可能不会同意此操作

sudo:执行后续命令,要以root的权限来执行

但是sudo命令,需要该普通用户在新人列表里面才可以执行,添加用户到新人列表是需要root身份的(下一篇解释)

1️⃣更改文件的拥有者

chown 指定拥有者 文件名

2️⃣更改文件的所属组

chgrp 指定所属组 文件名

3️⃣组合修改

chown 指定拥有者:指定所属组 文件名


注意问题

为什么没有修改为other

  1. other并不具体

  2. 修改了拥有者和所属组,不属于这两个的就是other

如果拥有者也是所属组,删除了拥有者的所有权利,那么还可以作为所属组的身份对文件进行访问/修改/执行 吗

​ Linux下文件的权限只会被认证一次

​ 即:首先判定你是谁,如果你是拥有者,那么只看拥有者权限,和你是否是所属组没关系。如果不是拥有者而是所属组,那么只看你的所属组权限


常见权限问题

目录权限

面试问题:进入一个目录属于什么权限?

相信很多人都会认为是 读权限

其实并不是

对于目录来说

  • 执行权限:进入目录
  • 可读权限:查看目录中的文件内容(如ls等命令)
  • 可写权限:在目录中创建 / 删除 / 修改 文件或目录

所以mkdir创建目录的时候,默认的权限就会有 读权限、写权限、执行权限等

umask

mkdir dir1创建一个目录,权限并不是 rwx rwx rwx

而是rwx rwx r-x

touch file1创建一个文件,权限是rw- rw- r--

why?

为什么创建出的文件或目录的权限不是从 777000开始

而是从其中间的某种状态开始呢?

Linux默认:

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

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

    (少了可执行,因为普通文件有各种文件类型,有些是不可执行的,如果某个文件可执行,后续自己加权限即可)

现象:

  • 创建一个目录,起始权限:775
  • 创建一个普通文件,起始权限:664

这是为什么呢?

其实,最终权限的确定 是和 一个掩码有关的

这个掩码就是umask ,叫做权限掩码

凡是在umask中出现的权限,都不应该在最终权限中出现

注意umask为4位数字,只关注umask的后三位即可,第一位其他权限位有关。如umask为0002,我们认为是002即可


查看umask

umask


所以 起始权限 与 umask 做怎样的运算才能得到 最终权限呢?

既然umask中出现的权限,都不应该出现在最终权限中,这就意味着umask与起始权限经过某种运算之后,保留起始权限中没有在umask中出现的权限

所以应该是起始权限 与 取反后的umask 做与运算

解释:

如果umask中某个位置为0,也就是umask中没有这个权限,那么取反后就是1,与起始权限做与运算就可以保留下来umask中没出现的权限

如果umask中某个位置是1,也就是umask中有这个权限,那么取反后就是0,与起始权限做与运算就可以去掉这个在umask中出现的权限

umask=002 二进制:000 000 010
#目录的最终权限:775 起始权限 777
 777: 111 111 111
~002: 111 111 101
 结果:111 111 101775
 
#普通文件的最终权限:664  起始权限 666
 666: 110 110 110
~002: 111 111 101
 结果:110 110 100664
 
 经验证是正确的

结论:最终权限=起始权限 & (~umask)

设置umask

如果想让最终权限不按照系统的来,那么可以自己设置umask

umask 0xxx:xxx是设置的umask值

举个例子

如果设置为umask 0777

这样得到的文件的最终权限 一定是000 也就是什么权限都没有

粘滞位

存在问题

一个用户如果有目录的写权限,那么该用户就可以对目录中的文件进行删除/修改,即使用户没有对改文件的写权限。

也就是说,我写的文件,凭什么你可以随便删?

验证一下:

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第15张图片

由上图可知,即使是root创建的文件,普通用户也可以删除

所以,这个机制似乎太不合理了,有了目录的写权限就可以随便删除别人的文件!

并且即使你把rootfile.txt的权限全部删除,虽然不可以读,但是同样可以删除。

也就是说:我不可以读也不可以写,但是我可以删!

当然,正常情况下不同的用户有各自的工作目录,一个用户的工作目录只有自己有读、写、执行权限,所属组以及other都是没有任何权限的。所以other连你的工作目录进都进不去,其实是很安全的!如图:image-20220722202245896

但是,不排除有特殊情况:所以如果所有的用户在一个工作目录下,那么岂不乱套了!

就比如根目录下的tmp目录:/tmp

【Linux】Shell外壳程序以及权限的理解(粘滞位、umask)_第16张图片

其实这个tmp目录就是存放所有目录临时文件的目录

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

也就是说,如果所有人在同一个目录下工作,默认是每个用户对目录下的所有文件都有删除/修改的权限,如何让所有用户只能删除/修改自己的文件呢?

(粘滞位是针对other的)

chmod O+t 目录名:添加粘滞位

chomd o-t 目录名:去掉粘滞位

这时候,目录的权限就变成了下图:

image-20220722204302083

此时对于other,权限变成了rwt,t就相当于是一种x的特殊情况,虽然其他人可以进入目录但是只能删除自己的文件,不能删除其他人的。

注意

1. 粘滞位只能给目录设置

2. 一般是谁设置粘滞位,谁才能取消(root不受限制)

如果一个目录被设置为"粘滞位",则该目录下的文件只能由以下成员删除:

  • 超级管理员
  • 该目录的所有者
  • 该文件的所有者

此篇文章结束~ 感谢阅读~❤️❤️❤️

在这里插入图片描述

你可能感兴趣的:(Linux,linux,windows,服务器)