Shell运行原理以及Linux中的权限问题

目录

一、shell的运行原理

二、Linux权限的概念

[2.1 用户账号切换](#2.1 用户账号切换)

[2.2 仅提升当前指令的权限](#2.2 仅提升当前指令的权限)

[2.3 将普通用户添加到信任列表](#2.3 将普通用户添加到信任列表)

三、Linux权限管理

[3.1 文件访问者的分类](#3.1 文件访问者的分类)

[3.2 文件类型和访问权限](#3.2 文件类型和访问权限)

[3.3 字符权限值的表示方法](#3.3 字符权限值的表示方法)

[3.3.1 字符表示方法](#3.3.1 字符表示方法)

[3.3.2 八进制表示法](#3.3.2 八进制表示法)

[3.4 文件访问权限的相关设置方法](#3.4 文件访问权限的相关设置方法)

[3.4.1 修改文件的访问权限](#3.4.1 修改文件的访问权限)

[3.4.2 修改文件的所有者](#3.4.2 修改文件的所有者)

[3.4.3 修改文件的所属组](#3.4.3 修改文件的所属组)

[3.4.4 修改文件掩码](#3.4.4 修改文件掩码)

[3.5 目录的权限](#3.5 目录的权限)

[3.6 粘滞位](#3.6 粘滞位)


一、shell的运行原理

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

Linux严格意义上说是一个操作系统内核,被称为"核心(kernel)",但一般用户不能直接使用kernel,而是通过kernel的"外壳程序",即Shell,来与kernel沟通

Shell即"命令行解释器":

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

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

Shell运行原理:

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

对比到Windows中就是,每运行一个程序就是创建一个子进程,如:微信、QQ。这些子进程中任何一个进程出现问题,都不会影响父进程

注意: Shell只是所有外壳程序的统称。如:在CentOS 7中的外壳程序名为bash

二、Linux权限的概念

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

超级用户的命令提示符为"#"

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

2.1 用户账号切换

当权限不足时,需从普通用户切换为root用户

bash 复制代码
su 用户名

从普通用户切换为root用户,输入su root后,输入root账户密码即可

从root账号切换为普通账号,不需输入密码

注意:

  • 从普通账号切换为root账号时,指令中的root可省略,因为root账号只有一个
  • 该指令也可以从一个普通用户切换为另一个普通用户,输入待切换用户的账号密码即可
  • 切换用户后,若想切回上次的用户,可通过Ctrl+D实现

2.2 仅提升当前指令的权限

在公司中大概率是不会拥有root账户的,但有时执行某些操作时权限不足,就需要有临时提升权限的方式

以普通用户的身份,修改另一个普通用户的密码

但并不是所用用户都可以使用sudo指令的

上图提示tmp用户不存在sudoers文件中,所以指令的权限得不到提升,只有被root用户添加到信任列表后,才拥有提升指令权限的能力

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

必须处于root账户下,才能进行该操作

使用vim /etc/sudoers 指令打开配置文件,找到**%wheel ALL=(ALL) ALL**处,在后续按图中案例添加即可

添加完毕后,该用户就可以使用sudo指令,即拥有提升权限的能力了

三、Linux权限管理

3.1 文件访问者的分类

  • 文件和文件目录的所有者(文件拥有者
  • 文件拥有者所在的组的用户(文件所属组
  • 其他用户(other

注意:

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

所属组

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

若没有所属组的概念,那么创建了一个文件后,要么就是只有拥有者能看到,要么就是其他人都能看到。而在实际情况中,希望的是拥有者和所在小组的小组成员都能看到,其他人看不到。于是就有了所属组这个概念,可以将文件设置为拥有者和所属组可见,而other不可见。所以所属组的存在是为了更灵活的进行权限配置,满足团队协作

可以通过指令ll来查看某一文件或文件目录的拥有者和所属组

3.2 文件类型和访问权限

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

这串字符由10个字符组成的。其中第一个字符所代表的就是该文件的文件类型

  • -:普通文件
  • d:目录
  • l:链接文件(类似于Windows中的快捷方式)
  • b:块设备文件(如硬盘、光驱等)
  • p:管道文件
  • c:字符设备文件
  • s:套接字文件

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

剩下的9个字符每三个为一组,分别代表该文件相对于其拥有者、所属组以及other是否拥有某种属性

每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个代表是否具有可写属性,第三个代表是否具有可执行属性。若是具有可读属性,则第一个位置的字符为r;若是具有可写属性,则第二个位置的字符为w;若是具有可执行属性,则第三个位置的字符为x。若某一位置为字符 - ,则说明不具有对应位置的属性

举例

data.txt文件是一个普通文件,该文件的拥有者和所属组对其都是可读可写的,但该文件的other对其只有读的权力

3.3 字符权限值的表示方法

3.3.1 字符表示方法

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

3.3.2 八进制表示法

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

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

3.4.1 修改文件的访问权限

符号设定法

bash 复制代码
chmod [who] [+-=] [mode] 文件名

常用选项: -R 递归修改目录文件的权限

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

mode

  • u:拥有者
  • g:所属组
  • o:other
  • a:所有用户

向tmp.txt文件添加other可写

数字设定法

bash 复制代码
chmod [numbers] filename

将对应的八进制数转换为二进制,进而设置对应权限值

  • 0:没有权限
  • 1:执行权限
  • 2:写权限
  • 4:读权限

给stat1.cpp文件设置权限为-rw-rw-r--

3.4.2 修改文件的所有者

bash 复制代码
chown 文件所有者 文件名

常用选项: -R 递归修改目录文件的拥有者

修改stat1.cpp文件的所有者为gg-bruse

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

3.4.3 修改文件的所属组

bash 复制代码
chown 文件所有者:文件所属组 文件名
bash 复制代码
chgrp 文件所属组 文件名

修改stat1.cpp文件的所有者和所属组为gg-bruse

修改文件stat1.cpp的文件所属组为gg-bruse

3.4.4 修改文件掩码

查看新建的文件和目录,都有各自默认的权限

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

但实际上创建出来的文件和目录的权限值与翻译出来的值并不相同,原因就是创建文件和目录的时候还受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask)

bash 复制代码
umask 权限值 #使用umask指令可以查看或修改文件掩码

实际创建出来的文件和目录的权限值还需进行进一步换算才能得出。首先将掩码的的后三位八进制换算为二进制,然后对其按位取反

然后将之前的新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是我们创建出来的文件和目录的权限值

也可以理解为在umask中出现的权限位,在最终权限中都不会出现

注意: 超级用户的默认掩码为0022,普通用户的默认掩码为0002

3.5 目录的权限

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

此时就出现了一个问题:只要用户拥有某目录的可写权限,就可以删除该目录中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。如下图,拥有当前目录的写权限,并不拥有test.txt文件的写权限,却依然删除成功

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

3.6 粘滞位

bash 复制代码
chmod +t 目录名

将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符"t"

此时另一个用户就算有该目录的可写权限,也无法删除该目录下的文件

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

  • 超级用户删除
  • 该目录的拥有者删除
  • 该文件的拥有者删除。

注意: 虽然目录被加上了粘滞位,但若用户有该目录的可写权限,不影响其在该目录下创建文件

相关推荐
阿里云大数据AI技术1 分钟前
ES Serverless 8.17王牌发布:向量检索「火力全开」,智能扩缩「秒级响应」!
大数据·运维·serverless
yzx9910133 分钟前
Linux 系统中的算法技巧与性能优化
linux·算法·性能优化
fengyehongWorld3 分钟前
Linux Docker的简介
linux·docker
wanhengidc4 分钟前
服务器中日志分析的作用都有哪些
运维·服务器
Mikhail_G34 分钟前
Python应用变量与数据类型
大数据·运维·开发语言·python·数据分析
曹瑞曹瑞35 分钟前
VMware导入vmdk文件
linux·运维·服务器
Johny_Zhao38 分钟前
2025年6月Docker镜像加速失效终极解决方案
linux·网络·网络安全·docker·信息安全·kubernetes·云计算·containerd·yum源·系统运维
hello kitty w1 小时前
Python学习(7) ----- Python起源
linux·python·学习
十年磨一剑~1 小时前
centos查看开启关闭防火墙状态
linux·运维·centos
无效的名字1 小时前
向日葵远程控制debian无法进入控制画面的解决方法
运维·debian