Linux中Shell运行原理和权限(下)(4)
文章目录
- 前言
- 一、Shell的运行原理
- 二、Linux当中的权限问题
- Linux权限的概念
- 如何将普通用户添加到信任列表
- 三、Linux权限管理
- 文件访问者的分类(人)
- 文件类型和访问权限(事物属性)
- 文件权限值的表示方法
- 文件访问权限的相关设置方法
- 如何改变文件的拥有者
- 如何改变文件的所属组
- 如何修改文件的掩码
- 目录的权限
- 粘滞位
- 总结
前言
前几篇中有些指令我没有介绍,大家也可自行在CSDN搜索来扩充知识面!
一、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。而这些子进程当中任何一个进程出现问题,都不会影响父进程,例如,当你的QQ出现卡死情况(程序异常)或你的QQ被关掉(程序终止),但其他子程序仍然可以运行。
注意: Shell只是所有外壳程序的统称,例如在centos 7当中的外壳程序名叫bash。
或者我打个比方,如果说你是⼀个闷骚且害羞的程序员(比如我),那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你⼼动的MM⼩花。你看上了⼩花,但是又不好意思直接表⽩,那就让你你家⼈找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给⼩花,⽽我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使⽤的bash。
二、Linux当中的权限问题
Linux权限的概念
在Linux下有两种用户,分别是超级用户(root)和普通用户。超级用户可以在Linux下做任何事情,几乎不受限制,而普通用户一般只能在自己的工作目录下(/home/xxx)工作,以及在系统上做有限的工作。换句话来说,所有的权限的概念都是用来限制普通用户的,而超级用户几乎不受限制。
超级用户的命令提示符是“#”。
普通用户的命令提示符是“$”。
如何实现用户账号之间的切换?
语法: su 用户名
功能: 用户切换。
从普通账号切换为root账号。
如何将普通用户添加到信任列表
首先你得先切换到超级用户,只有超级用户才有权力将普通用户添加到信任列表。
- 切换到超级用户后,我们使用vim打开文件sudoers进行添加。
- 添加如箭头标示的那一行
- 然后按ESC按键,并且接着 shift + : ,当下面出现 : 的时候再输入wq! + 回车结束
三、Linux权限管理
文件访问者的分类(人)
1)文件和文件目录的所有者(文件拥有者)。
2)文件拥有者所在的组的用户(文件所属组)。
3)其他用户(other)。
请注意!对于某一文件而言,其拥有者、所属组和 other 就是由超级用户(root)和普通用户所扮演。在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。若某一位置为字符 - ,则说明不具有对应位置的属性。
test.c文件是一个普通文件,该文件的拥有者对其是可读可写的,但该文件的所属组和other对其只有读的权力。
文件权限值的表示方法
a)字符表示方法
ll指令打印文件权限值时的表示方法就是字符表示法
b)八进制数值表示法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示
文件访问权限的相关设置方法
如何改变文件的访问权限
语法: chmod 选项 权限 文件名或目录名
功能: 设置文件的访问权限。
常用选项: -R 递归修改目录文件的权限。
如上图所示,我给 test.c 文件加上了可写可执行的权限
若要同时设置不同类用户的访问权限,则需用逗号隔开
如何改变文件的拥有者
语法: chown 选项 用户名 文件名或目录名
功能: 修改文件的拥有者。
注意: 修改文件的拥有者需要root用户进行操作,若是普通用户则需要进行权限提升
注意: 修改文件的拥有者需要root用户进行操作,若是普通用户则需要进行权限提升。
也可以使用chown指令同时修改文件的拥有者和所属组,将拥有者和所属组的用户名用冒号隔开即可
如何改变文件的所属组
语法: chgrp 选项 用户名 文件名或目录名
功能: 修改文件的所属组。
注意: 修改文件的所属组也需要进行权限提升。
如何修改文件的掩码
我们查看新建的文件和目录,它们都有自己默认的权限。
实际上,新建文件的默认权限为0666,新建目录的默认权限为0777。其中第一位的0与特殊权限有关,我们这里不必深究,而后面三位就是权限的八进制数值表示方法,我们将其翻译为字符表示方法
但实际上你会发现,你所 创建出来的文件 和 目录的权限值 往往不是我们所翻译出来的值,原因就是创建文件和目录的时候还要受到 umask 的影响
假设默认权限是mask,则实际创建出来的文件权限是:mask & (~umask)
语法: umask 权限值
功能: 查看或修改文件掩码。
因此我们实际创建出来的文件和目录的权限值还需要进行进一步换算才能得出。首先我们将掩码的的后三位八进制换算为二进制,然后对其进行按位取反
现在假设 umask 的掩码是 002
然后将之前的新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是我们创建出来的文件和目录的权限值
也可以理解为凡是在umask中出现的权限位,都不能在最终权限中出现。
因此我们也可以通过修改 umask 来设置文件的访问权限。
所以我们只要设置掩码为000,那么新创建的目录或文件就是默认权限 ;如果设置掩码为777,那么新创建的目录或文件就是无任何权限
目录的权限
对于文件来说,其可读可写可执行的属性我们都知道分别代表着什么对应的操作,那对于目录来说可读可写可执行又分别代表着什么呢?
1)可读权限: 如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容。
2)可写权限: 如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件。
3)可执行权限: 如果用户没有该目录的可执行权限,则无法通过cd指令进入到目录当中。
那么这就会出现一个问题:
只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。
注意看该图,我们有当前目录的读写权限,却没有 test.txt 的读写权限,但是我们却成功删除了 test.txt
粘滞位
为了解决这个不合理的问题,Linux引入了粘滞位的概念。
语法: chmod + t 目录名
功能: 给目录加上粘滞位
当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符 “t”。
此时另一个用户就算有该目录的可写权限,也无法删除该目录下的文件。
当一个目录被设置为粘滞位,则该目录下的文件只能由:
1)超级用户删除。
2)该目录的拥有者删除。
3)该文件的拥有者删除。
注意: 虽然目录被加上了粘滞位,但如果用户有该目录的可写权限,则不影响其在该目录下创建文件,只是对于删除会有影响!!!
总结
开始上难度了!不过接下来的一篇会很有意思,我会教大家来实操如何在Linux环境下用命令行来提交你自己的代码到gitee/github
相关文章:

Linux中Shell运行原理和权限(下)(4)
文章目录 前言一、Shell的运行原理二、Linux当中的权限问题Linux权限的概念如何将普通用户添加到信任列表 三、Linux权限管理文件访问者的分类(人)文件类型和访问权限(事物属性)文件权限值的表示方法文件访问权限的相关设置方法如…...

LeetCode热题100- 字符串解码【JavaScript讲解】
古语有云:“事以密成,语以泄败”! 关于字符串解码: 题目:题解:js代码:代码中遇到的方法:repeat方法:为什么这里不用this.strstack.push(result)? 题目&#x…...

每日一题——LRU缓存机制的C语言实现详解
LRU缓存机制的C语言实现详解 参考1. 数据结构设计双向链表节点哈希表节点哈希表LRU缓存结构 2. 初始化哈希表和双向链表哈希函数初始化哈希表初始化双向链表创建LRU缓存 3. 更新双向链表4. 实现Get操作5. 实现Put操作更新节点值删除最久未使用节点插入或更新节点 6. 释放缓存释…...
Leetcode3162:优质数对的总数 I
题目描述: 给你两个整数数组 nums1 和 nums2,长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以除尽 nums2[j] * k,则称数对 (i, j) 为 优质数对(0 < i < n - 1, 0 < j < m - 1)。 返回 优…...

docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结
官方网站 官方网址:etcd 二进制包下载:Install | etcd GitHub社区项目:etcd-io GitHub GitHub社区项目版本历史:Releases etcd-io/etcd GitHub 一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令…...

Apache SeaTunnel 构建实时数据同步管道(最新版)
文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member,Apache SkyWalking Committer,多年平台研发经验,目前专注于数据集成领域。 导读 在当今数字化快速发展的时代,数据已然成为企业决策…...

递归、搜索与回溯第二讲:二叉树中的深搜 穷举vs暴搜vs深搜vs回溯vs剪枝
递归、搜索与回溯第二讲:二叉树中的深搜 && 穷举vs暴搜vs深搜vs回溯vs剪枝 1.计算布尔二叉树的值2.求根节点到叶结点数字之和3.二叉树剪枝4.验证二叉搜索树5.二叉搜索树中第K小的元素6.二叉树的所有路径7.全排列8.子集 1.计算布尔二叉树的值 2.求根节点到叶…...

Hbase分布式——储存机制
说明: 客户端调用,到达zk。然后到大HMaster(主节点可以有多个但是只有和active在一起的才有效。)。然后找到一个HRegionServer(从节点可以有多个)去做保存操作。 每一个HRegionServer上管理着表的HRegion…...

Word表格中如何只单独调整某一单元格宽度
大家好,我是小鱼。 在日常制作Word表格时,表格中不同单元格有时需要设置不同的宽度,但是很多小伙伴会发现想单独调整某一个单元格宽度时,发现其它单元格宽度也会发生变化。那么,到底怎么才能单独调整某一单元格宽度呢…...

Build错误:Cannot determine build data storage root for project 和 无法加载主类的解决办法的经验分享
Build错误:Cannot determine build data storage root for project 解决方案与经验分享 1. 引言 查看错误信息 “Cannot determine build data storage root for project”的含义: 这是一个关于构建项目时遇到的常见错误。错误信息表明构建工具无法确定…...
【Springboot知识】Logback从1.2.x升级到1.3.x需要注意哪些点?
文章目录 **1. 确认依赖版本**示例依赖配置(Maven): **2. 处理 StaticLoggerBinder 的移除**解决方案: **3. 修改日志配置文件**示例 logback.xml 配置: **4. 检查兼容性问题**Spring Boot 2.x 的兼容性解决方案&#…...

大语言加持的闭环端到端自动驾驶模型 学习笔记纯干货
LMDrive:大语言模型辅助闭环端到端 LMDrive:大语言模型辅助闭环端到端 背景框架输入部分:导航指令:视觉数据:提示指令(可选):处理部分:输出部分: 视觉编码器…...

初阶数据结构(C语言实现)——2算法的时间复杂度和空间复杂度
目录 本节目标1. 算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 2.时间复杂度2.1 时间复杂度的概念2.1.1 入门习题2.1.2 进阶习题 2.2 常见时间复杂度 3. 空间复杂度3.1 常见空间复杂度 本节目标 算法效率时间复杂度空间复杂度常见时间复杂度以及复杂度oj练习 1. 算法…...

MySQL知识
1.Navicat客户端连接 打开navicat,点击连接,点击MySQL 输入连接名与密码,如果连接的mysql是windows下的mysql主机号就填写localhost 填写好后点击测试连接 点击确定,mysql连接navicat成功 2.MySQL数据定义语言(DDL) DDL用于数据库…...
【前端定位线上问题的多种方案(不依赖 Sentry)】
前端定位线上问题的多种方案(不依赖 Sentry) 🛠️ 一、构建时注入调试信息 🔧 1. 注入版本信息与 Git 提交哈希 Webpack 配置: // webpack.config.js const webpack require(webpack); const gitRevision require(…...

怎么修改node_modules里的文件,怎么使用patch-package修改node_modules的文件,怎么修改第三方库原文件。
在开发中会遇到需要node_modules里第三方库有bug,然后需要修改node_modules文件的情况 使用patch-package包可以修改node_modules里的文件 patch-package npm 官网:patch-package - npm 安装 npm i patch-package 修改文件后 npx patch-package s…...

muduo网络库2
Muduo网络库:底层实质上为Linux的epoll pthread线程池,且依赖boost库。 muduo的网络设计核心为一个线程一个事件循环,有一个main Reactor负载accept连接,然后把连接分发到某个sub Reactor(采用轮询的方式来选择sub Reactor)&…...
什么是DrawCall?DrawCall为什么会影响游戏运行效率?如何减少DrawCall?
目录 1 什么是DrawCall? 2 DrawCall为什么会影响游戏运行效率? 3 如何减少 DrawCall?(结合性能分析工具) 1 什么是DrawCall? DrawCall(绘制调用) 是 GPU 的一个指令,…...

LabVIEW电能质量分析软件
随着电力系统的复杂性增加,电能质量问题日益突出,传统的电能质量检测装置多采用DSP技术,不仅开发周期长、功能单一,而且在多功能集成方面存在局限性。基于LabVIEW虚拟仪器开发平台的电能质量分析软件利用FFT、STFT、WT、HHT等多种…...

【十二】Golang 映射
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...