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

本专栏内容为:Linux学习专栏,分为系统和网络两部分。 通过本专栏的深入学习,你可以了解并掌握Linux。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:Liunx从入门到精通
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

权限

  • Shell的运行原理
  • Linux当中的权限问题
    • Linux权限的概念
      • 如何实现用户账号之间的切换
      • 如何仅提升当前指令的权限
      • 如何将普通用户添加到信任列表
    • Linux权限管理
      • 文件访问者的分类(人)
      • 文件类型和访问权限(事物属性)
      • 文件权限值的表示方法
      • 文件访问权限的相关设置方法
        • 如何改变文件的访问权限
        • 如何改变文件的拥有者
        • 如何改变文件的所属组
        • 如何修改文件的掩码
      • 目录的权限
      • 粘滞位

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。

Linux当中的权限问题

Linux权限的概念

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

换句话来说,所有的权限的概念都是用来限制普通用户的,而超级用户几乎不受限制。
超级用户的命令提示符是“#”。
在这里插入图片描述

普通用户的命令提示符是“$”。
在这里插入图片描述

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

可能有时你的权限不够,需要从普通用户切换到超级用户,进而完成某些操作。

语法: su 用户名
功能: 用户切换。

从普通账号切换为root账号。
在这里插入图片描述
从root账号切换为普通账号。
在这里插入图片描述
注意:
1)从普通账号切换为root账号时,指令当中的root可省略,因为root账号只有一个。
2)该指令也可以从一个普通用户切换为另一个普通用户,输入待切换用户的账号密码即可。
3)切换用户后,若想切回上次的用户,可通过Ctrl+D实现

如何仅提升当前指令的权限

但可能某些情况下,你只想提升当前指令的权限,那么不必切换到超级用户。

语法: sudo 指令
功能: 提升当前指令的权限。

例如,我现在要以一名普通用户的身份,修改另一个普通用户的账号密码。
在这里插入图片描述
当你输入完你的密码后,可能会出现以下提示。
在这里插入图片描述
该提示说你没有被超级用户(root)添加到信用列表当中,所以该条指令的权限得不到提升(你想想嘛,怎么可能让一个普通用户随意更改另一个普通用户的密码嘛),只有当你被超级用户添加到信任列表后,你才拥有提升当前指令权限的能力。

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

那么首先你得先切换到超级用户,只有超级用户才有权力将普通用户添加到信任列表。
在这里插入图片描述
切换到超级用户后,我们使用vim打开文件sudoers进行添加。
在这里插入图片描述

在该处添加用户信息:
在这里插入图片描述
添加完毕后,该用户就可以使用sudo指令,也就是拥有提升当前指令权限的能力了。
在这里插入图片描述

Linux权限管理

文件访问者的分类(人)

对于用户来说,权限可以将用户分为三大类:
1)文件和文件目录的所有者(文件拥有者)。
2)文件拥有者所在的组的用户(文件所属组)。
3)其他用户(other)。

注意:
1)对于某一文件而言,其拥有者、所属组和other就是由超级用户(root)和普通用户所扮演。
2)在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。若某一位置为字符 - ,则说明不具有对应位置的属性。

现在我们来阐述一下该文件的类型以及权限。

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

文件权限值的表示方法

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

字符表示法说明
r - -仅可读
- w -仅可写
- - x仅可执行
r w -可读可写
r - x可读可执行
- w x可写可执行
r w x可读可写可执行
- - -无权限
2)八进制数值表示法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。例如
字符表示法二进制
----------------
r - -100
- w -010
- - x001
r w -110
r - x101
- w x011
r w x111
- - -000

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

如何改变文件的访问权限
语法: chmod 选项 权限 文件名或目录名
功能: 设置文件的访问权限。

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

chmod指令权限值的格式:
格式一: 用户符号 +/-/= 权限字符
1)+:向权限范围增加权限代号所表示的权限。
2)-:向权限范围取消权限代号所表示的权限。
3)=:向权限范围赋予权限代号所表示的权限。
用户符号:
1)u:拥有者。
2)g:所属组。
3)o:other。

在这里插入图片描述
若要同时设置不同类用户的访问权限,则需用逗号隔开。
在这里插入图片描述
格式二: 三位八进制数字
将对应的八进制数转换为二进制,进而设置对应权限值。
在这里插入图片描述

如何改变文件的访问权限
如何改变文件的拥有者

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

常用选项: -R 递归修改目录文件的拥有者。
在这里插入图片描述
注意: 修改文件的拥有者需要root用户进行操作,若是普通用户则需要进行权限提升。

也可以使用chown指令同时修改文件的拥有者和所属组,将拥有者和所属组的用户名用冒号隔开即可。
在这里插入图片描述

如何改变文件的所属组

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

常用选项: -R 递归修改目录文件的所属组。
在这里插入图片描述
注意: 修改文件的所属组也需要进行权限提升。

如何修改文件的掩码

我们查看新建的文件和目录,它们都有自己默认的权限。
在这里插入图片描述
实际上,新建文件的默认权限为0666,新建目录的默认权限为0777。其中第一位的0与特殊权限有关,我们这里不必深究,而后面三位就是权限的八进制数值表示方法,我们将其翻译为字符表示方法。
在这里插入图片描述
但实际上你会发现,你所创建出来的文件和目录的权限值往往不是我们所翻译出来的值,原因就是创建文件和目录的时候还要受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask)

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

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

在这里插入图片描述
然后将之前的新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是我们创建出来的文件和目录的权限值。
在这里插入图片描述
也可以理解为凡是在umask中出现的权限位,都不能在最终权限中出现。
在这里插入图片描述
因此我们也可以通过修改umask来设置文件的访问权限。
在这里插入图片描述
注意: 超级用户的默认掩码为0022,普通用户的默认掩码为0002。

目录的权限

对于文件来说,其可读可写可执行的属性我们都知道分别代表着什么对应的操作,那对于目录来说可读可写可执行又分别代表着什么呢?
1)可读权限: 如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容。
2)可写权限: 如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件。
3)可执行权限: 如果用户没有该目录的可执行权限,则无法通过cd指令进入到目录当中。

那么这就会出现一个问题:
只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。
在这里插入图片描述
为了解决这个不合理的问题,Linux引入了粘滞位的概念。

粘滞位

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

当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符“t”。
在这里插入图片描述
此时另一个用户就算有该目录的可写权限,也无法删除该目录下的文件。
在这里插入图片描述
当一个目录被设置为粘滞位,则该目录下的文件只能由:
1)超级用户删除。
2)该目录的拥有者删除。
3)该文件的拥有者删除。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2803590.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

k8s(2)

目录 一.二进制部署k8s 常见的K8S安装部署方式: k8s部署 二进制与高可用的区别 二.部署k8s 初始化操作: 每台node安装docker: 在 master01 节点上操作; 准备cfssl证书生成工具:: 执行脚本文件: 拉入etcd压缩包…

国产大模型,不会开启“烧钱游戏”

最近,OpenAI的Sora又在科技圈投入一枚深水炸弹。全球对于大模型的关注,又一次达到高峰。 聚焦到国内,百度、科大讯飞、商汤、华为等大型企业,以及海量的创业小公司都在布局大模型。以往每一次风口吹来的时候,资本总会…

springboot网站开发02-接入持久层框架mybatisPlus

springboot网站开发02-接入持久层框架mybatisPlus!经过上一小节内容分享,我们的项目嵌套模式框架搭建好了,下面就是开始编辑具体的业务代码了,我们使用到了持久层框架是mybatisPlus插件。下面是一些具体的植入框架的操作步骤。 第…

C# cass10 宗地初始化-根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层

运行环境Visual Studio 2022 c# cad2016 cass10 根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层 一、主要步骤 zdimport 方法:这个方法用于导入宗地信息。首先通过调用 AutoCAD API 获取当前活动文档、数据库和编辑器对象。然后根据 CreatePalette.Se…

[OpenAI]继ChatGPT后发布的Sora模型原理与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

day11_内部类代码块枚举课后练习 - 参考答案

文章目录 day11_课后练习代码阅读题第1题第2题第3题第4题第5题第6题第7题第8题第9题第10题第11题第12题 代码编程题第13题 day11_课后练习 代码阅读题 第1题 知识点:实例初始化 案例:判断运行结果 package com.atguigu.test01;class HelloA{public …

稳定运行矿山鸿蒙系统——飞凌嵌入式的这2款核心板获得「矿鸿资质证书」

飞凌嵌入式FETMX6ULL-S核心板和FETA40i-C核心板近期通过了“矿鸿兼容性测试认证”,这两款嵌入式核心板与矿鸿OS的结合将进一步推动煤矿行业的智能化进程。 矿鸿(MineHarmony)操作系统是由国家能源集团基于鸿蒙系统推出的一款专为煤矿行业设计…

网页403错误(Spring Security报异常 Encoded password does not look like BCrypt)

这个错误通常表现为"403 Forbidden"或"HTTP Status 403",它指的是访问资源被服务器理解但拒绝授权。换句话说,服务器可以理解你请求看到的页面,但它拒绝给你权限。 也就是说很可能测试给定的参数有问题,后端…

C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,&quo…

小说阅读软件书架界面和历史记录界面

1、引言 终于修改到书架界面和历史阅读记录界面了,修改完这两个界面就算完成一大半了,这两个界面其实都差不多,代码逻辑都一样,因此后面也会只展示书架界面的代码,历史阅读记录界面就展示效果图就行了。 2、实现代码 …

无线听觉新体验:南卡、韶音、墨觉骨传导耳机综合评测

作为一个资深的跑步爱好者,我几乎离不开音乐的陪伴。不知道大家有没有同感,有时候一首歌曲就是我坚持下去的动力,尤其是在那段艰难的跑步时刻。但是找到一款既能让我在运动中自由呼吸、又能提供优质音乐体验的耳机,并不是一件容易…

Redis(十五)Bitmap、Hyperloglog、GEO案例、布隆过滤器

文章目录 面试题常见统计类型聚合统计排序统计二值统计基数统计 Hyperloglog专有名词UV(Unique Visitor)独立访客PV(Page View)页面浏览量DAU(Daily Active User)日活跃用户量MAU(Monthly Activ…

人工智能 — 数字图像

目录 一、图像1、像素2、图像分辨率3、RGB 模型4、灰度5、通道6、对比度7、RGB 转化为 Gray8、RGB 值转化为浮点数9、二值化10、常用视觉库11、频率12、幅值 二、图像的取样与量化1、数字图像2、取样3、量化 三、上采样与下采样1、上采样(upsampling)2、…

Encoder-decoder 与Decoder-only 模型之间的使用区别

承接上文:Transformer Encoder-Decoer 结构回顾 笔者以huggingface T5 transformer 对encoder-decoder 模型进行了简单的回顾。 由于笔者最近使用decoder-only模型时发现,其使用细节和encoder-decoder有着非常大的区别;而huggingface的接口为…

解决SpringAMQP工作队列模型程序报错:WARN 48068:Failed to declare queue: simple.queue

这里写目录标题 1.运行环境2.报错信息3.解决方案4.查看解决之后的效果 1.运行环境 使用docker运行了RabbitMQ的服务器: 在idea中导入springAMQP的jar包,分别编写了子模块生产者publisher,消费者consumer: 1.在publisher中运行测试…

Excel Ctrl + E快捷键 批量合并提取数据

目录 一. 合并数据二. 提取数据 Ctrl L 只是快捷键,在数据面板中有快速填充的按钮。 一. 合并数据 🤔有如图所示的数据,现在想批量的把姓名和电话合在一起 🧐先把要处理的数据手动复制到一起,然后按下 Ctrl E 就可以…

Element table 实现表格行、列拖拽功能

安装包 npm install sortablejs --save <template><div class"draggable" style"padding: 20px"><el-table row-key"id" :data"tableData" style"width: 100%" border><el-table-columnv-for"(it…

【C++私房菜】面向对象中的多重继承以及菱形继承

文章目录 一、多重继承1、多重继承概念2、派生类构造函数和析构函数 二、菱形继承和虚继承2、虚继承后的构造函数和析构函数 三、has-a 与 is-a 一、多重继承 1、多重继承概念 **多重继承&#xff08;multiple inheritance&#xff09;**是指从多个直接基类中产生派生类的能力…

Stable Diffusion 模型分享:AstrAnime(Astr动画)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型&#xff0c;画风色彩鲜明&#xff0c;擅长绘制漂亮的小姐姐。 条目内容类型大模型…

uniapp实现全局悬浮框

uniapp实现全局悬浮框(按钮,页面,图片自行设置) 可拖动 话不多说直接上干货 1,在components新建组件(省去了每个页面都要引用组件的麻烦) 2,实现代码 <template><view class"call-plate" :style"top: top px;left: left px;" touchmove&quo…