Linux——Shell的运行原理和Linux文件权限

Shell的运行原理和Linux文件权限

文章目录

  • Shell的运行原理和Linux文件权限
    • 1. Shell的运行原理
      • (1) Shell是什么
      • (2) 为什么要有Shell
      • (3) Shell的运行原理
      • (4) 解析命令行
    • 2. Linux文件
      • (1) 文件属性
      • (2) 文件类型
      • (3) 文件权限
      • (4) 文件权限的修改
        • (1) chmod
        • (2) chown
        • (3) chgrp
      • (5) umask掩码
        • umask命令
      • (6) 目录权限
        • (1) 三个目录权限问题
        • (2) 粘滞位

1. Shell的运行原理

(1) Shell是什么

我们常说Linux是操作系统,但是严格意义上讲,Linux是一个操作系统内核,也就是核心(kernel),是操作系统的基石,我们的一切代码最终都是运行在操作系统内核上的。但通常,普通用户是不能直接使用kernel的,而是通过一个类似于桥梁的程序,也就是Shell外壳,来与kernel进行交流的。

Shell外壳程序是操作系统的外在表现形式,我们通过Shell来与操作系统内核进行交互。在Linux,我们在命令行解释器上输入Shell命令,实际上并没有直接与操作系统内核交互,而是Shell外壳程序先将我们的命令进行解析,然后再传递给内核执行相关的代码。

站在广义的角度上,我们认为操作系统 = 内核 + Shell,内核是操作系统最基本的部分,而Shell是操作系统的外在表现形式,我们通过Shell外壳程序来与操作系统内核进行交互;站在狭义的角度上,我们认为Linux操作系统就是Linux内核,因为哪怕失去了Shell,Linux内核仍然可以正常运行。

(2) 为什么要有Shell

不知道各位有没有发现,当我们在Windows系统下,我们常常不需要使用繁杂的命令,只需使用鼠标点击就可以完成很多操作,而Linux系统下,我们则需要经常使用命令来完成很多操作,这是为什么呢?

如果站在操作系统的设计者的角度,对于一款操作系统,不仅要保护操作系统的核心数据和代码,还必须要给不同的用户提供良好的操作环境,在Windows下我们这种使用鼠标点击的方式叫做GUI(图形用户界面),而在Linux下我们这种使用命令的方式叫做CLI(命令行用户界面),这两种方式都是Shell外壳程序,这也就是Shell存在的意义,只不过前者是图形化,后者是命令行。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(3) Shell的运行原理

Shell的运行原理可以简单概括为:

  1. 创建子进程,对我们的命令进行解析
  2. 将解析后的命令传递给内核
  3. 内核执行命令
  4. 将执行结果返回给Shell
  5. Shell将执行结果输出到终端

Shell创建子进程是为了避免错误的命令导致影响整个Shell进程,如果命令执行失败,整个Shell进程就会崩溃,而创建子进程则可以避免这种情况。

(4) 解析命令行

当我们使用命令行解释器时,会出现一大堆的字符串,这些字符串叫做命令行,命令行通常由以下几个部分组成:

  • 当前用户
  • 主机名
  • 当前路径
  • 指令行内容

例如:

root@bite-alicloud:~/lesson6#
  1. 当前用户:root
  2. 主机名:bite-alicloud
  3. 当前路径:~/lesson6
  4. 指令行内容:#(#表示普通用户,$表示超级用户)

2. Linux文件

在Linux中,秉承着认为一切皆文件的思想,Linux将所有设备都抽象为文件,例如键盘、显示器、磁盘等,我们都可以将它们看作文件,文件 = 文件属性 + 文件内容。

(1) 文件属性

文件属性包括:

  • 文件类型
  • 文件权限
  • 文件所有者
  • 文件大小
  • 文件创建时间
  • 文件修改时间

当我们使用ll命令时,会出现一大堆文件信息,例如:

-rw-r--r-- 1 root root 1234 11 00:00 test.txt

解析:

  1. -rw-r--r--:文件权限
  2. 1:文件的链接数
  3. root:文件所有者
  4. root:文件所属组
  5. 1234:文件大小
  6. 1月 1 00:00:文件修改时间
  7. test.txt:文件名

(2) 文件类型

在Linux中,文件类型不通过文件名后缀进行识别,而是通过文件属性里的权限前缀进行分类的,但我们还是推荐使用后缀,因为有些工具会识别后缀。

  • -:普通文件(常见的有文本、源代码、图片、视频、库、可执行程序等)
  • d:目录文件
  • b:块设备文件(常见的是磁盘)
  • c:字符设备文件(常见有键盘、显示器)
  • l:链接文件
  • p:管道文件
  • s:socket文件

(3) 文件权限

文件权限包括:

  • 文件所有者
  • 文件所属组
  • 其他用户

对于每一种角色来说,文件都需要提供三种权限:

  • 读权限:r(read)
  • 写权限:w(write)
  • 执行权限:x(execute)

当我们使用ls -l命令时,文件权限会显示在文件名的前面,例如:

-rw-r--r-- 1 root root 1234 11 00:00 test.txt

对于这个例子,我们将文件权限分为四个部分:

  1. -:文件类型,表示是一个普通文件
  2. rw-:文件所有者权限,表示文件所有者具有读写权限,但没有执行权限
  3. r--:文件所属组权限,表示文件所属组具有读权限,但没有写权限和执行权限
  4. r--:其他用户权限,表示其他用户具有读权限,但没有写权限和执行权限

也就是说,文件类型后会跟着9个字符,每三个字符表示一种角色,每种角色有三种权限,每种权限用rwx表示,-表示没有该权限。

8进制表示法:
如果我们将每一个权限用二进制表示,有该权限则用1表示,没有该权限则用0表示。那么,就会得到一个9个二进制位的数,每3个二进制位表示一种角色,这样,我们可以将每个角色的3个二进制位转换为8进制数,转换规则如下:

  • r:4
  • w:2
  • x:1

这样,一个文件的权限可以使用3个8进制数表示:

  • 第一个8进制数:文件所有者权限
  • 第二个8进制数:文件所属组权限
  • 第三个8进制数:其他用户权限

例如:

-rw-r--r--

该例子中,如果一个文件的权限是rw-r--r--,那么,使用9个二进制表示为110100100,我们再将其转化转换为8进制数,根据转换规则,得到644

(4) 文件权限的修改

(1) chmod

功能:修改文件权限。

语法

chmod [OPTION]... MODE[,MODE]... FILE...

常见选项

  • -R:递归修改目录及其子目录下的所有文件权限
  • -v:显示修改后的文件权限
  • -f:不显示错误信息
  • -c:仅显示更改的部分
  • -b:修改所有文件的权限
  • -n:不实际修改文件权限,仅输出修改后的权限

MODE

  • 符号模式:u+xu-xg+xg-xo+xo-xa+xa-x等(u表示所有者,g表示所属组,o表示其他用户,a表示所有用户,+表示增加权限,-表示取消权限)
  • 八进制模式:755644777
(2) chown

功能:修改文件所有者和所属组。

语法

chown [OPTION]... [OWNER][:[GROUP]] FILE...

常见选项

  • -R:递归修改目录及其子目录下的所有文件的所有者和所属组
  • -v:显示修改后的文件所有者和所属组
  • -f:不显示错误信息
  • -c:仅显示更改的部分

OWNER

  • 用户名
  • 用户ID

GROUP

  • 组名
  • 组ID
(3) chgrp

功能:修改文件所属组。

语法

chgrp [OPTION]... GROUP FILE...

常见选项

  • -R:递归修改目录及其子目录下的所有文件的所属组
  • -v:显示修改后的文件所属组
  • -f:不显示错误信息
  • -c:仅显示更改的部分

GROUP

  • 组名
  • 组ID

(5) umask掩码

umask掩码:定制一个文件被创建时的默认权限。

我们创建的普通文件时,默认权限不是666(rw-rw-rw-),而是664(rw-rw-r–);我们创造的目录文件时,默认权限不是777(rwxrwxrwx),而是775(rwxrwxrw-)。为什么会导致我们的默认权限要比初始权限小呢?
这是因为umask掩码会从初始权限中去掉在umask中出现的权限,也就是说umask掩码是限制文件权限的一种手段。

起始权限可以用二进制表示,而umask掩码也可以用二进制表示,从起始权限中去掉(不是减法)在umask中出现的权限就是我们的默认权限。

比如:

初始权限:111 111 111(777)

umask:000 000 010 (002)

我们可以看到起始权限(777)中右边第二位(other权限)在umask出现,那么就会从’1’变为’0’,所以我们的默认权限是:111 111 101(775)。

目录文件的起始权限是777,普通文件是666。

起始权限 & (~umask) = 默认权限

umask命令

功能:设置文件创建时的默认权限。

语法

umask [OPTION]... [MASK]

常见选项

  • -S:以符号模式显示掩码
  • -p:以八进制模式显示掩码

示例

umask  # 显示当前umask值,如022
umask -S  # 以符号模式显示,如u=rwx,g=rx,o=rx
umask 027  # 设置新的umask值

默认权限计算

  1. 目录文件:
起始权限:777
umask值:022
默认权限:755 (rwxr-xr-x)
  1. 普通文件:
起始权限:666
umask值:022
默认权限:644 (rw-r--r--)

注意事项

  1. umask值通常在系统启动时由/etc/profile设置
  2. 用户可以在~/.bashrc中修改自己的umask值
  3. root用户默认umask值通常为022,普通用户为002
  4. umask值越大,默认权限越小

(6) 目录权限

(1) 三个目录权限问题

对于每个角色来说:

  1. 目录能否进入,取决于它的x(可执行权限);

  2. 目录能否被读取,取决于它的r(读权限);

  3. 目录下能否新建/删除/修改文件,取决于它的w(写权限),但是可以直接修改目录下的文件的权限属性。

(2) 粘滞位

一个文件能否被删除,并不取决于文件本身,而取决于文件所处的目录的权限,删除者在目录中对应的权限是否具有w权限。如果我们想在一个特定的目录下实现文件共享,将目录的非拥有者的权限w开放,会导致该目录里的文件的非拥有者可以随意删除文件,因此我们给目录新增了一个权限:t(粘滞位)

粘滞位:给目录的other设置的一个权限位,具有x(可执行权限)的意义,同时也进一步对目录权限进行特殊限定:该目录里的文件,只有root和文件或目录的拥有者成员有权利删除对应文件,其他人一概不允许。

当一个目录被设置为“粘滞位”(用chmod+t),则该目录下的文件只能由:

  1. 超级管理员删除

  2. 该目录的拥有者删除

  3. 该文件的拥有者删除

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux守护进程与后台进程的区别

守护进程与后台进程有以下区别: 1. 概念与定义 后台进程: 是指在操作系统后台运行的进程,它不与用户直接交互(没有连接到用户的终端)。用户在终端中启动一个程序并让其在后台运行(如通过在命令后加“&…

Jmeter5.X性能测试

Jmeter5.X性能测试 文章目录 Jmeter5.X性能测试一、掌握Http基础协议1.1 浏览器的B/S架构和C/S架构1.2 HyperText Transfer Protocol 超文本传输协议1.3 超文本传输协议Http消息体拆分讲解1.4 HTTP的九种请求方法和响应码介绍1.5 Http请求头/响应头1.6 Http常见请求/响应头cont…

Spring 配置绑定原理分析

Spring 配置绑定原理分析 前言 Spring 应用中存在诸多配置,有的是系统配置,有的命令行启动参数配置,有的是yaml配置,有的是分布式配置中心配置,但对使用者而言总是可以通过ConfigurationProperties将它关联到一个Java…

爬虫下载网页文夹

爬虫下载网页pdf文件 import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin from urllib.parse import urljoin, unquote from tqdm import tqdm # 设置网页的URL base_url "http://119/download/dzz/pdf/"# 创建保存文件的…

数据结构-归并排序笔记

【数据结构】八大排序(超详解附动图源码)_数据结构排序-CSDN博客 看这个学思路 一 归并排序介绍: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解&#xf…

编译器优化乌龙——记一次死循环不进入问题

记一次死循环不生效问题 看如下代码,本意是我们模拟一次死循环,然后会在中断处理函数中更改waiting的值,更改waiting的值后,跳出死循环。 int waiting 0; while(waiting0){}运行起来发现,程序根本就没有进入这个死循…

构建第一个ArkTs应用

1、新建第一个页面文件。在“Project”窗口,点击“entry > src > main > ets > pages”,打开“Index.ets”文件,进行页面的编写。 2、新建第二个页面文件。在“Project”窗口,打开“entry > src > main > e…

一文搞懂Linux kernel编译步骤

一、前言 什么是Linux的内核编译呢?简单来说,Linux内核编译是一个将内核源代码转换成可在特定的硬件架构上运行的二进制文件的过程。通过编译内核,我们可以根据自己的需求和兴趣对内核进行定制和优化,以满足特定的应用场景。下文…

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

消息通知——公众号、小程序、短信对比

消息通知——公众号、小程序、短信对比 引言 在数字化时代,高效、准确的消息通知对于提升用户体验、增强用户粘性至关重要。本报告将深入分析三种常见的消息通知方式:微信公众号推送、微信小程序推送以及手机短信推送,从实现方式、优缺点及细…

三维测量与建模笔记 - 3.2 直接线性变换法标定DLT

DLT - Direct Linear Transform 上图中,透视成像对应的公式是共线方程,可以参考以下链接: https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说,需要找到。已知量是。 (u,v)是…

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么?说说你们项目里是怎么用消息队列的? 我们有一个订单系统,订单系统会每次下一个新订单的时候,就会发送一条消息到ActiveMQ里面去,后台有一个库存系统,负责获取…

【论文复现】KAN卷积:医学图像分割新前沿

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀知识图谱推理 1. 概述2. 核心创新点3. 模块介绍KANUNext模块 4. 本文主要结构5. 主要代码6. 数据集7. 结果展示8. 参考文献 前言:…

Oracle与SQL Server的语法区别

1)日期和日期转换函数。 SQL: SELECT A.*, CASE WHEN NVL(PAA009,) OR PAA009 >Convert(Varchar(10), SYSDATE,120) THEN Y ELSE N END AS ActiveUser FROM POWPAA A WHERE PAA001admin or PAA002admin Oracle: SELECT A.*, CASE WHEN NVL(PAA009,) or PAA009&…

基于TRIZ理论的便携式光伏手机充电装置创新

随着智能手机功能的日益强大,电量消耗问题也日益凸显,尤其是在户外活动时,电量告急常常让人措手不及。面对这一挑战,基于TRIZ(发明问题解决理论)的创新思维,一款全新的便携式光伏手机充电装置应…

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

NPU 可不可以代替 GPU

结论 先说结论&#xff0c;GPU分为可以做图形处理的传统意义上的真GPU&#xff0c;做HPC计算的GPGPU和做AI加速计算的GPGPU&#xff0c;所以下面分别说&#xff1a; 对于做图形处理的GPU&#xff0c;这个就和NPU 一样&#xff0c;属于DSA&#xff0c;没有替代性。当然&#xf…

python画图|hist()函数画直方图进阶

【1】引言 前序已经学习了hist()函数画直方图的基础教程&#xff0c;相关文章见下述链接&#xff1a; python画图|hist()函数画直方图初探-CSDN博客 在这里我们初步认识了hist()函数&#xff0c;并使用该函数画出了8个直方图。 之后又用bar(&#xff09;函数进行对比&#…