Linux系统编程--权限管理

权限管理

  • 第二讲 权限管理
    • 1. Shell命令以及运行原理
      • 1.1 知识引入
      • 1.2 概念介绍
      • 1.3 具体示例
    • 2. Linux权限问题
      • 2.1 权限概念
      • 2.2 用户分类
      • 2.3 切换用户
      • 2.4 用户提权
      • 2.5 文件权限管理
        • 2.5.1 文件访问者的分类(角色)
        • 2.5.2 文件类型和访问权限(事物属性)
          • 2.5.2.1 文件类型
          • 2.5.2.2 访问权限
            • 补充:什么是可执行
          • 2.5.2.3 具体示例
          • 2.5.2.4 文件后缀与文件类型
        • 2.5.3 文件权限值的表示方法
        • 2.5.4 文件访问权限的相关设置指令
          • 2.5.4.1 chmod 指令
            • chmod 指令权限的格式
            • 补充:访问文件时的特殊情况
          • 2.5.4.2 chown 指令
          • 2.5.4.3 chgrp 指令
      • 2.6 目录权限管理
        • 2.6.1 目录的权限
        • 2.6.2 最终权限(缺省权限)
          • 2.6.2.1 umask 指令
      • 2.7 沾滞位

第二讲 权限管理

1. Shell命令以及运行原理

1.1 知识引入

都知道 Windows 以图形化界面为交互方式,而 Linux 以命令行界面为交互方式。 Windows 和 Linux 的交互方式虽然不同,但本质上是一样的,图形化界面和命令行界面都是为了让用户进行相关操作,而图形化界面和命令行界面就是所说的“外壳程序(Shell)”。

在这里插入图片描述

1.2 概念介绍

Linux 严格意义上说是一个操作系统,称之为“核心(kernel)”,但一般用户不能直接使用 kernel,而是通过 kernel 的“外壳程序”,也就是所谓的 Shell,来与 kernel 沟通。Shell 将外部输入的命令分析解析后将认为合法的信息传递给内核进行执行,内核执行完后将要返回的信息交给外壳再由外壳显示给用户。

Shell最简单的定义就是“命令行解释器”:
1)将使用者的命令翻译给核心(kernel)处理。
2)将核心的处理结果翻译给使用者。

1.3 具体示例

  • 对于 Windows GUI,操作 Windows 不是直接操作 Windows 内核,而是通过图形接口、点击等方式来完成(比如进入 D 盘时,通常双击 D 盘盘符,或运行某个应用程序)。Windows GUI 会将进行的这些操作翻译为 Windows 内核所能理解的指令,然后传递给 Windows 内核进行处理。当 Windows kernel 处理完毕后,GUI 又会将处理结果翻译用户能够看懂的操作,这样与 Windows kernel 的交互成本就会被大大降低。
  • 对于 Linux,Shell 有相同的作用:它负责解析用户输入的命令,并将解析后的指令传给 Linux 内核。内核执行后,将结果返回给 Shell,再由 Shell 解析并展示给用户。

帮助理解:

假设你是一个优秀的程序员,你家庭条件也很不错,你爸是村长,你家有两套房、一辆车,你自己的年薪也是30W+。你喜欢上了村里的另一个姑凉如花,但是呢你十分内向,不敢向如花表明你的心意。

但是你们村中有一个十分厉害的媒婆:王婆,王婆在你们村方圆十里都是最厉害的媒婆,只要它出马基本上就没有谈不成的。所以你找上了王婆,让她去向如花说媒,王婆也去了。

不幸的是,如花表示你是一个好人,但是你们不适合,并且如花已经和村里的另一个高富帅订婚了,再过一年就结婚。

但是你是一个十分专一的人,非如花不可,于是你还是三番五次的找王婆去给你再说一说,王婆试了几次之后发现这媒完全不可能,于是后面直接不鸟你了,也不再去找如花。

你看王婆直接不鸟你了(Shell拦截非法指令),于是跟王婆说:“我爸是村长,王婆您再去给我说说吧。”王婆看这事不办不行,但是如果继续三番五次去说媒,自己的口碑也没了。

最后,王婆想了一个办法,王婆收了十几个徒弟,然后每次你找王婆,王婆都找一些冠冕堂皇的借口说自己没空,然后派徒弟去找如花,这样即使失败了也可以说是因为徒弟萌新太菜了,这样即不得罪村长,也保住了自己的口碑。(实习生模式,Shell 会进行创建子进程的方式进行命令行的解析

在上面的例子中,王婆就相当于 shell,用来传递你 (用户) 的信息 (指令) 给如花 (kernel),然后将如花的信息反馈给你,同时,王婆拒绝多次去说媒,相当于 shell 拦截了非法指令,变相的保护了 kernel。最后,为了保证自己的口碑,王婆安排自己的徒弟去说媒,相当于 shell 为了防止自身崩溃,所以自己不会直接去执行指令,而是派生子进程去执行命令行的解析

补充:

shell 是 “外壳程序” 的统称,不同 Linux 版本对应的 shell 程序可能不同,其中 bash 是标准的 GNU shell,所以它成为了所有 Linux 发行版上的标准 shell。 现在大多数现代 Linux 发行版都默认提供 Bash shell 。 对应上面的例子来说,shell 是媒婆,而 bash 是王婆

2. Linux权限问题

2.1 权限概念

什么是权限?

  1. 权限是限制人的。(人 = 真实的人 + 身份角色)
  2. 目标事物的属性也影响权限。

本质的说权限 = 角色 + 事物属性,最终就是权限影响你能不能做一件事。

2.2 用户分类

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

  • 超级用户:可以在 Linux 系统下做任何事情,几乎不受权限的限制;
  • 普通用户:在 Linux 下做权限范围内的事情;
  • 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”;

2.3 切换用户

Linux 切换用户的指令是:su [用户名]

在 Linux 中,如果要从超级用户切换到普通用户,直接 “su [用户名]” 即可,没有任何限制:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是如果要从普通用户切换到超级用户,就需要输入 root 密码。普通用户切换到 root 用户有两种方式:

  • su:切换到 root 的当前目录;
  • su -:直接切换到 root 的根目录;

在这里插入图片描述

在这里插入图片描述

**注意:**注:Linux 出于安全考虑,从键盘输入的密码在终端上是不会回显的,也就是说输入密码时屏幕不会显示任何东西。

2.4 用户提权

在工作使用Linux的时候可能会出现这样一种状况:当前有一条指令必须拥有超级用户的权限才能执行,但不想切换用户,想直接让普通用户以root用户的身份去执行该指令。

sudo 指令可以满足需求:

在这里插入图片描述

执行 sudo 指令发现了两个奇怪的现象:

1、使用 sudo 指令让我们拥有root用户的权限,按理来说应该输入root密码,但事实是它让输入自己普通用户的密码;

2、我以 tcq 的普通用户身份执行 sudo 指令,它提示 tcq 用户不在 sudoers file 内,sudo 失败。

上面这些现象是由 sudo 的机制造成的:sudo 存在的目的是为了 给受信任的用户提供最少的执行障碍,受信任的用户是指被添加到 sudoers 文件中的用户。也就是说,当普通用户存在于 sudoers 文件中时,说明 root 用户充分信任此普通用户,所以当这个普通用户使用 sudo 指令提升权限时只需要输入自己的密码即可。而如果此普通用户不在 sudoers 文件中,那么自然也不能通过 sudo 指令提权。

注意:sudo 的有限时间为15分钟,即当使用 sudo 提权成功后,后面15分钟内再次使用 sudo 指令不需要再次输入密码。

2.5 文件权限管理

因为在 Linux 下一切皆文件,所以 Linux 的权限问题都是依附于文件的,所以谈到权限一般指的是文件的权限。

同时在 2.1 中提到权限 = 角色 + 事物属性,这里的角色也就是文件访问者,事物属性也就是文件类型和访问权限

2.5.1 文件访问者的分类(角色)

在 Linux 下,文件的访问者被分为三类:

  • 所有者:文件和文件目录的所有者:u (user)。
  • 所属组:文件和文件目录的所有者所在的组的用户:g (group)。
  • 其他用户:除所有者和所属组用户之外的用户:o (other)。

关于文件的所有者和其他用户相信大家都很容易理解,但是为什么会有一个所属组呢?以一个例子说明:

假设一家刚起步的很穷的公司要开发一款产品,该公司的老板奉行竞争理念,所以他把手下的人分为了两个组,让他们来研发同一款产品,最后哪个组的产品更优哪个组就拿额外的奖金。

但是呢由于公司很穷,只买得起一台主机,这时候问题就出现了:两个组的成员公用一台主机,那么组内成员的代码如何进行共享呢?

如果我把文件设置为私有,这样虽然另外一组的人看不到我的代码,但同时我的队友也看不到,而如果我把文件设置为共有,那么又可能有代码泄露的风险。

为了解决这种情况,Linux 设计出了所属组的概念,可以把多个用户归为一个组,让组内的成员共享文件,组外的成员则受权限限制。

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

Liunx 中一共有七种文件:

  • d:目录;
  • -:普通文件 (可执行程序也属于普通文件);
  • l:软链接(类似Windows的快捷方式)
  • b:块设备文件(例如硬盘、光驱等)
  • p:管道文件
  • c:字符设备文件(例如屏幕等串口设备)
  • s:套接口文件
2.5.2.2 访问权限

在 Linux 中查看一个文件/目录时,文件前面通常会出现很长一串字符:

在这里插入图片描述

他们对应的含义如下:

在这里插入图片描述

第一个字符代表文件类型,后面九个字符三三一组分别代表文件拥有者、所属组和其他用户的权限,其中文件的权限一共分为四类:

r:读权限:Read 对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限。
w:写权限:Write 对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限。
x:可执行权限:execute 对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限。

-:表示不具有该权限

补充:什么是可执行

在 Linux 下可执行 = 该文件是一个可执行文件 + 该角色有可执行权限

2.5.2.3 具体示例
-rwxr-xr-x 1 root root 8408 May  1 11:49 a.out

按上图中的第一行的 a.out 文件,其首先是一个普通文件,文件拥有者和所属组都是root,对于文件拥有者有读权限、写权限和可执行权限,对于文件所属组具有读权限和可执行权限,对于其他用户具有读权限和可执行权限

2.5.2.4 文件后缀与文件类型

在之前就提到,Linux 中不以文件的后缀名来区分文件类型,文件后缀属于文件名的一部分。但这并不不代表不可以使用文件后缀来区分文件类型,意思就是虽然在 Linux 眼中文件后缀没用,但是可以把文件后缀当作对用户的一个提示符号;

同时,Linux 中不区分文件后缀并不代表 Linux 下的各种工具,比如 gcc、g++不区分。

2.5.3 文件权限值的表示方法
  1. 字符表示法

    在这里插入图片描述

  2. 八进制数值表示法

    在这里插入图片描述

2.5.4 文件访问权限的相关设置指令
2.5.4.1 chmod 指令

格式chmod [参数] 权限 文件名

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

常用选项

  • -R 递归修改目录文件的权限;

**注意:**只有文件的拥有者,或者root,可以修改自己的的权限。

chmod 指令权限的格式
  1. 用户符号 +/-/= 权限字符

    用户符号:

    • u:拥有者
    • g:拥有者同组用户
    • o:其它用户
    • a:所有用户

    +/-/= 的意义:

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

    权限字符:

    • r:读权限
    • w:写权限
    • x:可执行权限
    • -:取消此权限

    指令演示:

    1. 对单个用户 ± 权限:

      在这里插入图片描述

    2. 对多个用户 ± 权限:

      在这里插入图片描述

  2. 三位八进制数字

    文件的权限一共三种:读写执行,所以用三个二进制位就可以表示全部情况,每一位都代表一个权限,依次是读写执行,有此权限就置1,没有此权限就置0,最后组成的三位二进制数再转化为八进制数即可用三个八进制数,一次表示三个角色的三个权限。

    指令演示:

    在这里插入图片描述

补充:访问文件时的特殊情况

当遇到如下这中文件拥有者和文件所属组均为同一人,但是二者的权限不同,此时会依靠哪一个角色的权限呢?

在这里插入图片描述

user、group 和 other 与当前角色进行身份对比的时候,依次只对比一次。如上,test.txt 文件的拥有者和所属组成员都是 tcq 但是当取消了文件拥有者的读权限的时候尽管 tcq 身为所属组成员也应该有读权限但是因为身份对比顺序的问题其无法读取文件中的内容。

2.5.4.2 chown 指令

格式chown [参数] 用户名 文件名

功能:修改文件的拥有者。

常用选项:

  • -R 处理指定目录以及其子目录下的所有文件;

**注意:**当使用 chown 指令将属于自己的文件赋给别人时,需要获得别人的同意,所以在一般情况下是不能改变文件的拥有者的。只有 root 不受权限的约束,可以直接将属于 A 的文件赋给 B,而不需要征得 A 和 B 的同意。

2.5.4.3 chgrp 指令

格式chgrp [参数] 用户组名 文件名

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

常用选项

  • -R 递归修改文件或目录的所属组。

**注意:**和修改文件的拥有者一样,不能直接修改文件的所属组,需要征得别人的同意,而 root 不受权限约束。

2.6 目录权限管理

2.6.1 目录的权限

目录权限所代表的含义如下:

  1. 可执行权限:能否进入目录,如果目录没有可执行权限, 则无法cd到目录中。
  2. 可读权限:能否查看目录中的文件内容,如果目录没有可读权限, 则无法用 ls 等命令查看目录中的文件内容。
  3. 可写权限:能否在目录中创建与删除文件,如果目录没有可写权限, 则无法在目录中创建文件, 无法在目录中进行删除修改文件名等修改文件的操作。
2.6.2 最终权限(缺省权限)

根据上面权限的介绍,可知如果要进入一个目录,就必须有可执行权限,然而对于普通文件并不是必须需要有可执行权限。这也就是为什么普通文件的起始权限666,而目录文件的起始权限777的原因。

但是经过实践自行创建的普通文件最终权限是775,目录文件是664。而这也叫做缺省权限。造成这样的结果是因为创建文件或目录的时候除了受默认权限的约束之外,还要受到 umask (文件掩码) 的影响。

在这里插入图片描述

2.6.2.1 umask 指令

格式umask 权限值

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

**作用:**影响创建文件和目录的缺省权限,使用 umask的本质是增强操作系统对新需求的灵活性。

注意:

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

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

指令演示:

查看文件掩码:

在这里插入图片描述

**修改文件掩码:**可以看到,当把文件掩码设置为000后,此时创建出的文件的最终权限就等于文件的起始权限。
在这里插入图片描述

2.7 沾滞位

在一个Linux系统中通常有很多用户,并且可以看到不同用户的家目录是只有用户本身可以进行访问等操作,不同的用户对于文件的访问是隔离的。

那么有时就会有这样一种需求:不同的用户需要在一个公共的目录下进行临时文件的增删查改,这个公共目录通常由 root 用户创建,然后将此目录默认掩码修改为777。
在这里插入图片描述

在这里插入图片描述

但是这里出现了一个问题:由于这个公共目录的权限是777,所以任何一个用户都可以删除此目录下的文件,无论该文件是否属于此用户。

为了出来上面这种不科学的情况,Linux 引入了粘滞位的概念。

粘滞位是权限的一种特殊情况,它不影响不同用户在公共目录下的读写执行操作,但是它可以禁止不同用户之间互删文件。粘滞位设置的方式很简单,只需要在已有权限基础上加上 t 即可,并且添加时不用指定用户,Linux 会自动识别。

在这里插入图片描述

当一个目录被设置为 “粘滞位” 以后,该目录下的文件只能由文件的所有者或者 root 删除,其余用户不能删除。

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

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

相关文章

【智能硬件】X86和ARM架构的区别

详细解释X86架构和ARM架构之间的区别以及它们各自的特点。X86 架构定义与历史定义:X86是一种计算机处理器体系结构,最初由英特尔公司开发。它是一系列指令集的集合体。历史:最早的X86架构是Intel 8086处理器,在1978年发布。后续发…

玳瑁的嵌入式日记D13-0806(C语言)

指针1.指针指针 就是地址(地址就是内存单元的编号)指针变量 (结合语境) eg:定义一个指针指针这一类数据 --- 数据类型 --- 指针类型 (1).指针 是什么 (2).指针类型 int a; //int数据类型 a是int型变量 //a的空间 想来存储 整型数据 2.指针的定义 基类型 * 指针变量名…

密码学基础知识总结

密码学基础知识总结 一、Base编码 1. Base系列特征 编码类型字符集特征Base160-9, A-F密文长度偶数Base32A-Z, 2-7包含数字2-7Base64a-z,0-9,,/,密文长度是8的倍数Base36A-Z,0-9仅支持整数加密Base910-9,a-z,A-Z,特殊符号高密度编码Base100Emoji表情表情符号组成 2. 典型题型…

PostgreSQL 中 pg_wal文件过多过大的清理方法及关键注意事项的总结

PostgreSQL 中 pg_wal文件过多过大的清理方法及关键注意事项的总结 以下是针对 PostgreSQL 中 pg_wal 文件过多过大的清理方法及关键注意事项的总结 一、安全清理 WAL 文件的完整流程 1. 确认数据库和备份完整性 备份验证:确保最近的物理备份(如 pg_base…

Django事务支持

1.事务概念 事务是一组不可分割的操作序列,这些操作要么全部执行,要么全部不执行。事务具有四个关键属性,通常称为 ACID 特性: 原子性(Atomicity):事务是一个不可分割的工作单位,事务…

<form> + <iframe> 方式下载大文件的机制

使用 <form> <iframe> 方式下载大文件的机制之所以稳定&#xff0c;核心在于其‌分块传输‌和‌浏览器沙箱隔离‌设计。以下是技术原理详解&#xff1a; 一、底层工作机制 ‌分块传输协议‌ 表单提交后&#xff0c;服务器按 Transfer-Encoding: chunked 分块返回数…

Python--OCR(2)

一、明确 OCR 任务边界首先定义 OCR 系统的核心目标&#xff1a;场景&#xff1a;印刷体&#xff08;如文档、发票&#xff09;/ 手写体&#xff08;如笔记&#xff09;/ 特定场景&#xff08;如车牌、身份证&#xff09;输入&#xff1a;图像格式&#xff08;JPG/PNG&#xff…

基于Django的计算机资源爬虫及可视化系统的设计与实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主一、项目背景二、项目目标三、系统架构与技术选型四、系统功能模块五、应用场景与价值六、项目特色与创新点七、总结每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试…

SH3001六轴传感器应用(二)(IIC驱动开发)

一、前言我这边使用的开发板原本已经做好了该sensor的驱动&#xff0c;但是使用过程中发现&#xff0c;原始驱动sensor是通过事件的方式上报的&#xff0c;加速度和陀螺仪数据并不同步&#xff0c;不满足使用要求&#xff0c;只有重新写一个iic的驱动&#xff0c;进行sensor数据…

面试题:基础的sql命令

基础的 SQL 命令主要用于对数据库进行查询、新增、修改、删除等操作&#xff0c;可分为以下几类&#xff1a;一、数据查询&#xff08;SELECT&#xff09;用于从表中获取数据&#xff0c;是最常用的命令。 基本语法&#xff1a;SELECT 列名1, 列名2... FROM 表名 WHERE 条件;示…

Leetcode-3488距离最小相等元素查询

依旧二分&#xff0c;链接如下3488. 距离最小相等元素查询 看题目是个循环数组&#xff0c;记得当时做过一道什么题也是循环数组&#xff0c;就想着直接数组复制一下&#xff0c;然后跟上一道题一样&#xff0c;用hashmap来存储value的值以及value对应下标的vector。 和灵神的…

C++中的关联容器

文章目录使用关联容器定义关联容器关键字类型的要求pair类型用作返回类型关联容器上的操作关联容器的迭代器关联容器和算法添加元素删除元素map的下标操作访问元素无序容器对关键字的要求关联容器支持高效的关键字查找和访问。两个主要的关联容器的类型是map和set。其中map中的…

【Git】git提交代码报错Git: husky > pre-commit

git提交代码报错原因 这个问题是因为当你在终端输入git commit -m “XXX”,提交代码的时候,pre-commit(客户端)钩子&#xff0c;它会在Git键入提交信息前运行做代码风格检查。如果代码不符合相应规则&#xff0c;则报错&#xff0c;而它的检测规则就是根据.git/hooks/pre-commi…

Unity开发者快速认识Unreal 的C++(六)GameMode之PlayerController

继承关系&#xff1a;Aactor&#xff0c;INavAgentInterface <--- AController<--- PlayerController &#xff0c;PlayerController也是一个Actor,继承了Actor的一些通用的属性和工具函数下图是PlayerController初始化组件的一个子阶段从图中可以得到的信息是&#xf…

Vue 3 服务端渲染(SSR)与客户端渲染(CSR)的区别及解决方案

1. SSR与CSR的区别1.1. SSR的原理服务端渲染&#xff08;SSR&#xff09;是在服务器端将 Vue 组件渲染为 HTML 字符串&#xff0c;并将其发送给客户端。这种方式与客户端渲染&#xff08;CSR&#xff09;不同&#xff0c;后者是在浏览器中执行 JavaScript 来生成 HTML。在 SSR …

Matlab快速回顾

一1.数值 显示 格式format style 设置eg: pi format longE;or2.清除指令clc 清除命令行窗口clear 清除工作区cls3.搜索路径设置path(path,E:\ads\)oraddpath4.M文件用户把要实现的命令写在一个以.m为扩展的文件中&#xff0c;然后由matlab系统进行解读&#xff0c;最后运行结果…

开源低代码+AI引擎:百特搭企业级开发平台的演进

在数字化转型进入深水区的今天&#xff0c;企业应用开发面临前所未有的复杂挑战&#xff1a;既要快速响应业务需求&#xff0c;又要确保系统灵活可控&#xff1b;既要降低技术门槛&#xff0c;又要保障核心安全。传统开发模式与单一形态的低代码工具已难以满足多层次需求。融合…

学习 Android(十五)NDK进阶及性能优化

学习 Android&#xff08;十五&#xff09;NDK进阶及性能优化 对 NDK 相关知识有了初步的了解之后&#xff0c;我们可以更加深入的去学习 NDK 相关知识&#xff0c;接下来&#xff0c;我们将按照以下步骤进行深入学习&#xff1a; 深入理解JNI调用过程和性能消耗常见 JNI 坑&am…

QT5.12.8 QTabWidget 透明样式QSS

/* 设置QTabWidget本身 :不加也行*/ QTabWidget#aaa_tabwdt {background: transparent;border: none; /* 移除边框可能有助于透明效果 */ }/* 标签页内的容器部件 :必须加&#xff0c;标签也才会透明 */ QTabWidget#aaa_tabwdt QWidget, QTabWidget#aaa_tabwdt QFrame {backgro…

【FAQ】Script导出SharePoint 目录文件列表并统计大小

一、只导出文件列表的方法 1) 保存脚本&#xff08;建议名&#xff1a;D:\tmp\Export-SharePoint-FileList.ps1&#xff09; <# 导出 SharePoint 指定文件夹&#xff08;含子文件夹&#xff09;的文件列表到 CSV&#xff08;不统计大小&#xff09; 前提&#xff1a;已安…