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

news2024/11/15 17:55:44

目录

一、shell的运行原理

二、Linux权限的概念

2.1 用户账号切换

2.2 仅提升当前指令的权限

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

三、Linux权限管理

3.1 文件访问者的分类

3.2 文件类型和访问权限

3.3 字符权限值的表示方法

3.3.1 字符表示方法

3.3.2 八进制表示法

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

3.4.1 修改文件的访问权限

3.4.2 修改文件的所有者

3.4.3 修改文件的所属组

3.4.4 修改文件掩码

3.5 目录的权限

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用户

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 修改文件的访问权限

符号设定法

chmod [who] [+-=] [mode] 文件名

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

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

mode

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

向tmp.txt文件添加other可写

 数字设定法

chmod [numbers] filename

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

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

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

3.4.2 修改文件的所有者

chown 文件所有者 文件名

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

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

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

3.4.3 修改文件的所属组

chown 文件所有者:文件所属组 文件名
chgrp 文件所属组 文件名

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

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

3.4.4 修改文件掩码

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

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

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

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

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

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

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

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

3.5 目录的权限

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

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

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

3.6 粘滞位

chmod +t 目录名

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

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

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

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

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

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

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

相关文章

CSS学习04

文章目录 1.精灵图1.1 为什么需要精灵图1.2 精灵图(sprites)的使用 2.字体图标2.1 字体图标的产生2.2 字体图标的优点**2.3** **字体图标的下载****2.4** **字体图标的引入**2.5 字体图标的追加 3.CSS 三角3.1 介绍 4.CSS 用户界面样式4.1 鼠标样式 curs…

openGauss学习笔记-11 openGauss 简单数据管理-INSERT INTO语句

文章目录 openGauss学习笔记-11 openGauss 简单数据管理-INSERT INTO语句11.1 语法格式11.2 参数说明11.3 示例 openGauss学习笔记-11 openGauss 简单数据管理-INSERT INTO语句 在创建一个表后,表中并没有数据,使用这个表之前,需要向表中插入…

【Go|第8期】Lorca读取HTML的三种方式

日期:2023年7月16日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

【云原生】K8S单节点搭建

Kubernetes Kubernetes基础概念架构1、基础环境2、安装kubelet、kubeadm、kubectl 2、使用kubeadm引导集群1、下载各个机器需要的镜像2、初始化主节点 Kubernetes核心实战Pod Kubernetes基础概念 kubernetes具有以下特性: ● 服务发现和负载均衡 Kubernetes 可以使…

leetcode 669. 修剪二叉搜索树

2023.7.15 知道了如何删除二叉树节点的逻辑之后,这题就不难了。 可以参考删除二叉搜索树中的节点这篇文章。 下面直接上代码: class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(root nullptr) return root;root->…

MacOS使用USB接口与IPhone进行Socket通信

演示效果如下: 开源地址: GitHub - rsms/peertalk: iOS and Mac Cocoa library for communicating over USB 克隆源码: git clone https://github.com/rsms/peertalk.git 克隆后打开peertalk然后启动xcode工程 先启动MacOS服务端工程,再启动iOS客户端工程 客户端 服务端

[java安全]URLDNS

文章目录 [java安全]URLDNS前言HashMapURLURLStreamHandler调用过程调用链流程图POC [java安全]URLDNS 前言 URLDNS利用链是一条很简单的链子,可以用来查看java反序列化是否存在反序列化漏洞,如果存在,就会触发dns查询请求 它有如下优点&a…

spring复习:(35)在getBean时,在哪里根据普通bean和工厂bean进行区分处理来返回的?

在AbstractBeanFactory的doGetBean方法: 调用的getObjectForBeanInstance方法部分代码如下: 如果不是工厂bean,则直接将实例返回,否则调用getObjectFromFactoryBean方法获取工厂bean的getObject方法返回的对象 protected Object getObjectF…

Gradle和Aritifactory

Gradle和Aritifactory 本文链接:https://blog.csdn.net/feather_wch/article/details/131746580 文章目录 Gradle和AritifactoryGradle基本介绍Gradle插件开发流程本地仓库artifactory搭建添加仓库使用本地仓库gradle插件仓库引入 Gradle基本介绍 1、Gradle是一种…

node使用fluent-ffmpeg把webm格式的音频转成mp3

下载并安装ffmpeg http://ffmpeg.org/download.html?aemtntg-on https://www.gyan.dev/ffmpeg/builds/ 配置环境变量: 查询版本 装包: yarn add fluent-ffmpeg const ffmpeg require(fluent-ffmpeg)ffmpeg(/temp/ai/hello.webm).output(/temp/ai/h…

leetcode 542. 01 矩阵

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1: 输入:mat [[0,0,0],[0,1,0],[0,0,0]] 输出:[[0,0,0],…

TaskExecutor和ExecutorService的简单整合

文章目录 一、遇到问题二、达成目的三、开始调研1、使用Async获取线程池流程2、查看中间件线程池工具类3、观察AsyncConfigurer接口4、查看TaskExecutorAdapter源码 四、复盘总结 一、遇到问题 自己负责的项目想通过引入一个中间件,达到在业务场景维度的全链路日志…

【【51单片机的蜂鸣器-11】】

51单片机的蜂鸣器 DS1302我一直有问题搁置了几百天了 先来看看蜂鸣器 搞了一个礼拜verilog然后出去吃饭 估计自己得有10多天没看c语言和51单片机了 现在先处理一下蜂鸣器的问题 蜂鸣器 蜂鸣器分为有源蜂鸣器和无源蜂鸣器 有源内部自带震荡源,将正负极接上直流电压…

类之间的关系

1. 关系强弱顺序(由强到弱) 泛化实现组合聚合关联依赖 图中,组合和聚合标错了 2. 依赖 虚线箭头,箭头指向被依赖类依赖关系描述了两个类之间的临时关系。通常不会持续整个对象的生命周期,而是创建一个临时的关系以满…

string【1】介绍与使用(超详解哦)

string的介绍与使用 引言string类常用接口构造函数容量操作size与lengthcapacityresizereserveclearempty 元素访问迭代器访问beginendrbeginrend范围for 下标访问 字符串修改insertappendpush_backoperatorpop_backerase 字符串查找findrfind 非成员函数operator>>opera…

光场成像2.0——聚焦型光场相机

光场2.0 1. 发展历程 由于光场1.0从结构上子图像的分辨率严重依赖MLA子透镜的数量,因此分辨率一直受限,限制了光场1.0结构的广泛应用。针对此不足,在2008年,又一篇伟大的论文出现了,该论文提出了全分辨率光场渲染的概…

CS拒绝连接,Cobalt Strike连接失败,Cobalt Strike使用方法(一)

拒绝连接 connection refused:connect。 kali端(服务器端)和本地端win10。看看端口开启状态 先启动服务器端 查看端口开启状态,确定50050端口开启,可以参阅本文章点击跳转 没问题再往下看。 使用步骤 chmod 777 ./teamserver…

【运维工程师学习】Centos中MySQL替换MariaDB

【运维工程师学习】Centos8中MySQL替换MariaDB 1、查看已有的mysql2、MySQL官网tar包下载3、找到下载路径解压4、移动解压后的文件夹到/usr/local/mysql5、创建data文件夹,一般用于存放数据库文件数据6、创建用户组7、更改用户文件夹权限8、生成my.cnf文件9、编辑my…

排序子序列,倒置字符串讲解(图文并茂)

目录 1.排序子序列 2.倒置字符串 1.排序子序列 排序子序列_牛客笔试题_牛客网 (nowcoder.com) 首先题干中提到非递增序列和非递减序列,那么我们就要先弄明白什么是上述2种序列: 非递增序列:a[i] > a[i1] 如:3 2 1 或者 3 3 …