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

embedded/2025/1/18 1:12:44/

Shell的运行原理

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel? 从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:

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

对比windows GUI,我们操作windows不是直接操作windows内核,而是通过图接口形,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结

果在通过内核运行出结果,通过shell解析给用户。

  • 帮助理解:如果说你是一个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的 且有让你心动的MM小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫 它王婆,它对应我们常使用的bash。

具体图像理解

Shell的运行原理

1)创建子进程,让子进程进行命令行解释

2)子进程出现任何问题,都不影响父进程Shell

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

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

Linux权限的概念

Linux下有两种用户:超级用户(root)、普通用户。

超级用户:可以再linux系统下做任何事情,不受限制

普通用户:linux下做有限的事情。

超级用户的命令提示符是“#”普通用户的命令提示符是“$”

如何实现用户账号之间的切换

命令:su [用户名] 或者 su - [用户名]

功能:切换用户。

例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。

从root切换为普通用户

从普通用户切换为root

注意:

1)从普通账号切换为root账号时,指令当中你的root可以省略,因为root账号只有一个,并且su默认就是切换到root

2) 该用户也可以从一个普通用户切换为另一个普通用户,输入待切换用户的密码就可以了

3)切换用户之后,若想切回上次的用户,可通过Ctrl + D或exit实现

如何提升指令的权限

在某些情况下,我们只想提升当前指令的权限,那么没必要切换到超级用户

语法:sudo指令

功能:提升当前指令的权限

例如,我现在要以一名普通用户的身份,修改另一个普通用户的账号密码

当你输入密码之后,可能会得到以下提示

出现该提示就说明你没有被超级用户(root)添加到信用列表当中,所以该指令的权限得不到提升,一般都不会让普通用户更改普通用户的权限吧,那岂不是人人都是root,只有当你被超级用户添加到信任列表之后,你才拥有提升当前指令权限的功能

Linux权限的管理

文件访问者的分类(人)

文件和文件目录的所有者:u---User(文件拥有者)

文件和文件目录的所有者所在的组的用户:g---Group(文件所属组)

其它用户:o---Others(other)

这里注意:

1)对于某一个文件来说,拥有者,所属组和other就是由超级用户(root)和普通用户所扮演的角色

2)所有角色都要隶属于某一个组,哪怕这个组只有你一个人(这时,你可以设置你的用户名为组名)

那为什么会有这个所属组的概念?

 在某个公司中,这个公司有两个小团队在同一个Linux服务器上进行者同一个项目的开发(赛马模式),而你就是A组当中的一员,你创建了一个文件,这个文件只有你(拥有者)能看到或者其他人(other)也能看到,而你希望的是你自己和你的小组成员能看到,剩下的人看不到

于是就有了所属组这个概念,你可以将你的小组成员的权限设置为所属组,而other不可见,这样就可以使团体协作更加灵活

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

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

文件类型和访问权限

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

权限涉及某个具体的事物来说,我们还需要讨论事物本身的属性,以及是否具有可读,可读,可执行的属性

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

可以看到上图有一堆信息,那么它们分别对应什么意思呢?

rwx分别代表的意思是:

r:代表该用户可以对文件读操作

w:代表该用户可以对文件进行写操作

x:代表该文件可以执行

-: 该用户没有这个位置的权限

不同的字符代表不同的文件类型:

1)d:文件夹

2)-:普通文件

3)l:软链接(类似Windows的快捷方式)

4)b:块设备文件(例如硬盘、光驱等)

5)p:管道文件

6)c:字符设备文件(例如屏幕等串口设备)

7)s:套接口文件

注:在Linux中文件类型于文件后缀无关

文件权限值的表示方法

1) 字符表示方法

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

字符表示法说明
r--仅可读
-w-仅可写
--x仅可执行
rw-可读可写
r-w可读可执行
-wx可写可执行
rwx可读可写可执行
---无权限

2)八进制表示法

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

权限符号(读,写,执行)八进制二进制
r        4100
w2010
x1001
rw6110
rx5101
wx3011
rwx7111
---0000

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

如何改变文件的访问权限

语法:chmod 选项 权限 文件名或目录名

功能:设置文件的访问权限

常用选项:

R -> 递归修改目录文件的权限 说明:只有文件的拥有者和root才可以改变文件的权限

chmod指令权限值得格式

① 用户表示符+/-/=权限字符 

+:向权限范围增加权限代号所表示的权限

-:向权限范围取消权限代号所表示的权限

=:向权限范围赋予权限代号所表示的权限

用户符号:  

u:拥有者

g:所属组

o:其它用户

a:所有用户

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

我们还可以使用八进制的数字来设置对应的权限值

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

如何改变文件的拥有者

语法:chown 选项 用户名 文件名或目录名

功能:修改文件的拥有者

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

 

注意:修改拥有者需要root账户,或者使用sudo给这条指令进行提权

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

如何改变文件所属组

语法:chgrp [参数] 用户组名 文件名

功能:修改文件或目录的所属组

常用选项:-R 递归修改文件或目录的所属组

注意:修改所属组也需要进行权限提升或者使用root身份进行

如何修改文件的掩码

我们查看新创建的文件或者目录它们都有自己默认的权限

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

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

umask

功能: 查看或修改文件掩码

新建文件夹默认权限=0666

新建目录默认权限=0777

但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到 umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask

格式:umask 权限值

说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值0022普通用 户默认0002。

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

将文件和目录的默认权限值分别与它进行按位与操作

通过计算最终可以得到文件和目录真正的默认权限

新建文件:rw- rw- r--

新建目录:rwx rwx rwx  

因此我们也可以通过修改umask来设置文件的访问权限

目录的权限

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

1)可读权限:如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容

2)可写权限:如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件

3)可执行权限:如果用户没有该目录的可写执行权限,则无法通过cd指令进入到目录当中

那么这就会引发一个问题:

只要用户拥有某目录的可写权限,就可以删除该目录当中的文件而不论该用户是否拥有该文件的可写权限,这显然是不合理的

为了解决这个问题Linux中引入了粘滞位

粘滞位

语法:chmod + t 目录名

功能: 该目录加上粘滞位

当一个用户将某一个粘滞位后该目录的权限值最后一位会变成字符 “t”

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

当一个目录设置了粘滞位,则该目录只能由

1)超级用户删除

2)该目录的拥有者删除

3)该文件的拥有者删除

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


http://www.ppmy.cn/embedded/154809.html

相关文章

Centos9 + Docker 安装 MySQL8.4.0 + 定时备份数据库到本地

Centos9 Docker 安装 MySQL8.4.0 定时备份数据库到本地 创建目录,创建配置文件启动容器命令定时备份MySQL执行脚本Linux每日定时任务命令文件内参数其他时间参数 AT一次性定时任务 创建目录,创建配置文件 $ mkdir -p /opt/mysql/conf$ vim /opt/mysql/…

Spring Boot中yml和properties的区别

properties 和 yml 都是 Spring Boot 支持的两种配置文件,可以看作是 Spring Boot 在不同时期的两款“产品”。主要是为了取代 XML 文件格式来配置项目。 properties 配置文件属于早期,也是目前创建 Spring Boot(2.x)项目时默认的…

深度剖析:NLP 领域基于 TF-IDF 和 Text-Rank 的关键字提取原理

今天,我想写一篇自然语言处理领域两大关键词提取技术 TF-IDF 和 Text-Rank。这两项技术在文本处理的世界里犹如两颗璀璨的明星,各自散发着独特的光芒,帮助我们从海量的文本数据中精准地提炼出关键信息,无论是在学术研究、信息检索…

七十五:握手的优化:Session缓存、Ticket票据及TLS 1.3的0-RTT

引言 在现代互联网环境中,安全性和性能是设计网络协议时至关重要的两个方面。传输层安全性(TLS)协议是实现安全传输的关键机制。然而,传统的TLS握手过程虽然安全,但是存在潜在的延迟问题。为了优化握手的效率&#xf…

git 常用命令 git revert

git revert 是 Git 中用于撤销之前提交更改的命令。它通过创建一个新的提交来取消指定提交引入的更改,而不是直接修改历史记录。这使得 git revert 成为一种安全且非破坏性的撤销方式,特别适用于已经推送到远程仓库或被其他开发者依赖的提交。 git reve…

Ruby JSON 优化之路:性能提升的探索与实践

在 Ruby 编程的世界里,JSON 处理是一个至关重要的环节。今天,就来深入探讨一下 Ruby JSON 的优化过程,看看如何让它的性能更上一层楼。 一、批量 API 优化:解决哈希表构建效率问题 在之前的工作中,我们已经着手进行了…

【Vue3 入门到实战】3. ref 和 reactive区别和适用场景

目录 ​编辑 1. ref 部分 1.1 ref定义基本数据类型 1.2 ref 定义引用数据类型 2. reactive 函数 3. ref 和 reactive 对比 3.1 原理 3.2 区别 3.3 使用原则 在 Vue 3 中 ref 和 reactive 是用于创建响应式数据的两个核心函数。它们都属于 Composition API 的一部分&…

专题 - STM32

基础 基础知识 STM所有产品线(列举型号): STM产品的3内核架构(列举ARM芯片架构): STM32的3开发方式: STM32的5开发工具和套件: 若要在电脑上直接硬件级调试STM32设备,则…