【Linux】权限管理

今天我们开始权限的学习

一、shell 命令以及运行原理

Linux严格意义上说的是一个操作系统我们称之为“核心kernel“ 但我们一般用户不能直接使用kernel。

而是通过kernel的 外壳程序也就是所谓的 shell来与kernel沟通。

shell 是什么

shell 是包裹在操作系统外部的软件层所以形象的称之为 外壳程序

而从技术角度Shell的最简单定义是命令行解释器command Interpreter主要包含

  • 将使用者的命令翻译给核心kernel处理。
  • 同时将核心kernel的处理结果翻译给使用者。

以上说明我们可以用这幅图来理解

image-20221129112318290

那么我们如何理解 shell ?

我们理解 shell 分为两个层面理性理解感性理解

理性理解

对比windows GUI我们操作windows 不是直接操作windows内核而是通过图形接口点击从而完成我们的操作比如进入D盘的操作我们通常是双击D盘盘符.或者运行起来一个应用程序。

shell 对于Linux有相同的作用主要是对我们的指令进行解析解析指令给Linux内核。反馈结果在通过内核运行出结果通过shell解析给用户。

如果shell 接受到非法指令可能会直接拦截不会让操作系统执行指令从而达到保护操作系统的目的。

为了防止用户的非法指令导致 shell 自身崩溃shell 一般都不会去执行对应的指令而是让子进程去执行。

感性理解

可能理性理解比较生涩我们就用一个小故事来感性讲解它们之间的关系

人物简介

  • 张三地主家的傻儿子情窦初开的羞涩码农年薪30万+有房有车有存款不会和女生交流从小暗恋如花。
  • 如花张三的暗恋对象心系李四觉得张三是个二愣子没有一点好感。
  • 李四如花的男朋友两人经常一起看电视。
  • 王婆张家村知名红娘说媒无一败绩人称张家村小月老。
  • 村长又名张老三是张三和蔼可亲的村长父亲全村首富在张家村一手遮天。

image-20221129121333842

故事开始

从前有个人叫张三张三从小就沉迷于编程在大学毕业后他也拿到了一份不错的 offer 30w+。但是张三到现在还没有谈过恋爱于是想起了在家乡的如花感觉自己十分想念家乡。由于强烈的思乡之情张三回到了张家村。

张三的父亲是全村首富是村长权势很大。张三找了村东头的王婆帮自己和如花说一下媒。张三告诉王婆自己的需求让如花接受自己和如花谈恋爱。王婆知道了张三的需求跑去找如花。

王婆来到了如花的家和如花说“如花呀我们那个村长的儿子张三对你有些意思人家年薪30w有房有车有存款你考虑考虑”如花想起小时候有个暗恋他的二傻子张三立马起了鸡皮疙瘩和王婆说我对张三没感觉我们不合适。

王婆接收到信息后回去和张三说如花呢觉得你挺好但是你俩不合适要不你换个。张三坚持说我就要如花王婆拗不过你更拗不过你的村长父亲。于是王婆就又去如花家门口还没到呢就远远的看到李四和如花在看电视李四和如花的家长也在聊天到了谈婚论嫁的地步了。于是王婆就折返回张三家直接和张三说你和如花真的不适合如花不可能和你有交际了你还是打消这个念头吧

但是张三没有放弃王婆不想给他说媒但是害怕张三的村长父亲。自己不想给张三说媒但是没办法。我知道这个媒事说不成还要给他办一两次失败没有影响但是说媒次数多了就不好了。那王婆的月老会所就受到影响了。说不成媒还会影响自己的口碑划不来。

王婆决定招聘实习生。有一天村长又叫王婆去给张三说媒王婆没去她派了一个实习生A去。这时成功不成功已经不重要了反正王婆自己没去。这样的原因是因为说砸了不是王婆干的自己不会收到影响就算失败了王婆还可以换一个实习生B过去。这样不会影响到自己王婆在这样的方法之下以后别人都找王婆说媒的时候都会排实习生过去做王婆做的工作。

听完这个故事我们也可以大致猜出它们扮演的角色张三是 用户王婆是 shell如花是 操作系统

image-20221129184017458

案例重讲解

  1. 张三(用户)把自己的需求给 王婆(shell) 王婆(shell) 问 如花(操作系统) 考虑是否和张三谈恋爱就是在 执行用户的指令。如花不考虑张三就是类似于禁止访问或程序运行失败最后王婆将结果反馈给张三就是把 shell 把结果返回给用户

  2. 第二次王婆看到如花心有所属后没有再去找如花就是 shell指令为了保护操作系统而拦截了非法请求

  3. 王婆聘请实习生让实习生去说媒就是 shell在执行命令的时候会创建子进程来执行

通过两种理解后我们总结一下shell 是外壳程序包裹在操作系统外层的软件层为命令行解释/操作解释将用户的操作解释交给操作系统让操作系统执行执行完毕将结果经过shell再传递给用户。

补充

如果我们在终端输入 ls /usr/bin/bash -a

[lx@VM-4-3-centos ~]$ ls /usr/bin/bash -a
/usr/bin/bash

之前使用ls /usr/bin/bash -a是显示的并不是shell而是bashbash也是一种外壳程序。对于它们两个我们可以把它理解为 bash 是王婆但是 shell 是媒婆。bash是 centos 上的外壳程序而 shell 是 外壳程序 的统称。

二、Linux的用户权限

1、权限概念引入

生活中 权限处处存在。比如爱奇艺有些视频是vip才能看的打游戏的时候有些皮肤是需要钱买的这些都是对人的约束和限制

有时访问的对象天然可能没有这种“属性”。比如我想在看小说的时候在番茄小说上和 visual studio 2022上一样写代码这是不可能的。因为没有这种功能应用上没有这一层属性。

所以我们基本可以得出 权限 = 人 + 事物属性这一结论。

了解了基本概念我们开始讲解 Linux 上的权限。

2、用户分类

Linux上有两种用户root(超级用户) 和 普通用户

  • root(超级用户)可以在linux下做任何事情不受权限约束且一台机器上只有一个root用户。
  • 普通用户在Linux下做有限的事情可以有多个普通用户。
  • 超级用户的命令提示符是“#”普通用户的命令提示符是“$”。

3、用户切换

命令su 用户名

功能切换用户

对于 root用户来说使用 su 普通用户 可以直接切换到普通用户

image-20221129225248829

但是对于普通用户来说使用 su 指令时会要求输入 root 用户的密码

image-20221129225425631

而对于 普通用户 切换到 超级用户 还有两种方式

  1. su从普通用户切换到超级用户所处工作目录不变化只单纯地进行身份变化
  2. su -从普通用户切换到超级用户会改变工作目录

对于 su

image-20221129231111348

对于 su -

image-20221129230719415

注如果切换用户后想要退出可以按 ctrl + d 退出回到之前的用户。

4、用户提权

使用普通用户时有时会因为权限不够而导致某条指令无法执行。

假如我用 lx 用户创建一个文件然后切换到 root 用户后写入内容并减权切回 lx 用户发现无法查看文件

image-20221129235558865

直接就出现了报错Permission denied意思是权限被拒绝。

面对这种情况可以 单条指令进行暂时提权

对于提权就要用到 sudo 指令但是这个需要配置一下不会配置的同学可以跳转到这篇博客

sudo 指令是 让普通用户使用单条指令时暂时拥有 root 用户的权限使用 sudo 命令后需要输入 当前普通用户的密码

image-20221129235804526

注sudo 的存活期一般为五分钟五分钟内再次使用 sudo 指令无需输入密码。

埋下伏笔sudo输的是普通用户的密码那么我想要加权只要输自己的密码就好了那么root是不是形同虚设这个问题在以后的文章中会提及大家可以思考一下。

三、Linux 权限管理

对于 Linux 的权限管理我们主要围绕一张图进行讲解

image-20221130005735203

图里部分的内容会在下面详细讲解。

1、文件访问者的角色划分

对于 Linux 文件的访问者可以分成三类

  • 文件拥有者文件和文件目录的所有者u —— user
  • 文件所属组文件和文件目录的所有者所在组的用户g —— group
  • 文件的 other其它用户除了拥有者和所属组之外的用户o —— others

Linux 任何一个文件都一定有文件的 拥有者 和 other拥有这个文件的就是拥有者除了拥有者之外的其他用户就是 other。

但是所属组是什么为什么要存在所属组

我们再次通过故事理解

image-20221130002243221

假如某公司只有一台机器公司允许不同的小组来完成一项工作组间为竞争关系。组A和组B赢的小组的产品会被重金打造推出。

张三被分到了a组李四被分到了b组。a组组长叫做小ab组小b。

他们用的是不同的目录公司的技术总监创建了两个目录A_code,b_code存放他们的产品。a组代码放A_codeb组代码放b_code。

张三写完了代码组长小a要看但是这里Linux不考虑所属组的概念只有拥有者和other张三是拥有者那么小a属于other。给小a开放权限也就是给other开权限小a可以看了但是李四也是other就也能看到了这里也就涉及到了权限安全问题。

所以 Linux 引入了 所属组 的概念让拥有者为组内成员开放权限给组里的人看其他人还是other其他人看不了。这样子权限安全问题就减少了。

说到这里我们再梳理一下 用户 和 文件访问者的关系

用户就是 root 和 普通用户是人。而 拥有者、所属组、other 是角色。

人可以扮演不同的角色但是角色可以一直变化。用户可以是拥有者、所属组、other 中的任意一个但是角色不可能称为人。

2、文件类型和访问权限

我们之前学习的第一个指令就是 ls 指令ll 可以列出文件详细信息

image-20221130010115889

那么先开始的一长串10个字符是什么意思呢就比如-rw-rw-r--

这10个字符可以分为两组第一个字符后九个字符。分别对应着 文件类型文件访问权限

a、文件类型(后缀理解 + file 指令讲解)

第一个字符为文件类型。可能大家会有些疑惑文件类型不是由文件后缀来区别的吗

我们通过样例求证一下Linux 中文件类型是否是由文件后缀来区别的

首先nano 一个 test.c向其中输入代码编译运行

image-20221130011209533

程序可以跑过那么我修改一下 a.out 的文件后缀呢

image-20221130011342453

程序依然可以跑过这就证明Linux上文件类型和后缀无关

但是再修改 test.c 的后缀呢test.c 还能编译过吗

image-20221130011801133

这里却报错了是因为我们证明结果错误吗其实并不是这是因为在Linux下文件后缀不用来标识文件类型不代表gcc这个软件不需要后缀。系统不管但不代表操作文件的软件不关心。

那么说到这我们可以怎么理解 Linux 中的 文件后缀

  1. 文件后缀是给用户看的让用户确定文件是什么类型。
  2. 将后缀看做文件名的一部分。

讲到这里我们再回到正题继续讲解文件类型。

文件类型大约被分为如下几类

  • -普通文件文本可执行程序归档文件(压缩包)等平常带后缀的文件在Linux下统一被称为普通文件
  • d文件夹目录
  • l软链接类似Windows的快捷方式
  • b块设备文件例如磁盘、光驱等
  • p管道文件
  • c字符设备文件例如键盘或显示器
  • s网络套接字socket文件

举个样例

image-20221130012717584

file 指令

在 Linux 中file 指令能 辨识文件类型

语法file [选项] 文件或目录…

常用选项

  • -c 详细显示指令执行过程便于排错或分析程序执行的情形。
  • -z 尝试去解读压缩文件的内容。

演示

可执行程序

image-20221130162053737

空文件

image-20221130162121825

b、文件访问权限

后9个字符为 文件访问权限。9个字符每三个一组分别代表着 拥有者、所属组、other的权限。

  • r —— 读Read对文件而言具有读取文件内容的权限对目录来说具有浏览该目录信息的权限权值为4.
  • w —— 写Write对文件而言具有修改文件内容的权限对目录来说具有删除移动目录内文件的权限权值为2.
  • x —— 可执行execute对文件而言具有执行文件的权限对目录来说具有进入目录的权限权值为1。
  • -表示不具有该项权限

问题回顾

-rw-rw-r--后九个字符就代表着拥有者具有读、写权限不具有执行权限所属组具有读、写权限不具有执行权限other具有读权限不具有写、执行权限。

四、文件访问权限的更改

文件访问权限的修改主要分为对 拥有者、所属组、other权限的更改对文件拥有者的更改对文件所属组的用户的更改

一般来说更改一个文件的权限必须是文件的拥有者或者是 root 用户。

1、chmod 指令(对拥有者、所属组、other权限的更改)

功能设置文件的访问权限

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

常用选项

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

chmod 命令设置权限的格式

  1. chmod u/g/o/a ±= rwx filename
  • +向权限范围增加权限代号所表示的权限

  • -向权限范围取消权限代号所表示的权限

  • =向权限范围赋予权限代号所表示的权限

用户符号

  • u拥有者

  • g所属组

  • o其它用户

  • a所有用户

字符表示法表

image-20221130014939053

演示

对单个用户的权限进行更改chmod 用户 ±权限 文件名

image-20221130162835640

对多个用户的权限进行修改chmod 用户 ±权限,用户 ±权限,…(上限三个拥有者、所属组、other) 文件名

image-20221130163230644

对全部用户进行权限修改chmod a ± 用户权限 文件名

image-20221130164145787

对用户进行 = 方式权限修改例如 u = g就是让 拥有者获得所属组对等的权限

image-20221130164514144

  1. chmod 三位八进制 filename

通常写作 chmod 三位八进制 用户名的形式每个八进制按顺序分别表示 拥有者、所属组、other三个八进制组成的序列就可以表示各角色的权限。

r 权限权值为4w 权值为2x 权值为1。

八进制数值表示法表

image-20221130015041526

举个例子614

拥有者6 = 4 + 2 + 0设置拥有者有读权限有写权限无执行权限。

所属组1 = 0 + 0 + 1设置所属组无读权限无写权限有执行权限。

other4 = 0 + 4 + 0设置other无读权限有写权限无执行权限。

演示

image-20221130170027141

2、chown(修改文件的拥有者)

功能修改文件的拥有者

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

演示

当前我的家目录有如下用户

image-20221130170731839

lx 用户当前文件夹

image-20221130170711403

如果我想要把 file.txt 的 拥有者 从 lx 改为 Guldan能否修改成功

image-20221130171051770

表示权限不被允许我 lx 即时拥有者又是所属组为什么不让我更改呢

举个例子吧如果有一天一个人和你不认识就要送你一辆车你要还是不要万一这是口黑锅呢让你做背锅侠。如果那个人告诉你这是你买彩票中的你才有可能接受。

对于权限来说也是一样的。但是在 Linux 上总不可能在你给权限的时候给别人留个言说我给你个权限吧所以 普通用户是无法直接修改文件拥有者的

但是我们可以用 root 强制把文件拥有者改掉谁让 root 是超级管理员呢就比如我使用 sudo 提权一下然后强制改掉

image-20221130171706108

3、 chgrp(修改文件的所属组)

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

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

常用选项-R 递归修改文件或目录的所属组

演示

同样的通过 sudo 提权修改

image-20221130172050508

补充chownchgrp 可以同时使用格式为sudo chown 用户名 : 用户名 filename

比如将拥有者和所属组都改回 lx

image-20221130172408210

4、有无权限的区别

首先我将 file.txt 的权限全部去掉

image-20221130182301821

如果我现在读 file.txt

image-20221130182704205

被权限拒绝了再也用 echo "hello" > file.txt 写入试试

image-20221130182642133

我当前是文件的拥有者 lx 但是我在没有权限的情况下依然不能访问

那么 root 呢我们用 root 试试

image-20221130182946919

我们发现权限并不能约束 root 因为我 root 是超级管理员权限是约束普通人的。

总结一下Linux 上权限是约束普通用户的root 不会被约束对于普通用户被权限约束了什么都干不了对于 root即使没有权限还是能畅通无阻

五、目录的权限

目录权限的功能

  • 可执行权限 - x : 如果目录没有可执行权限, 则无法cd到目录中.
  • 可读权限 - r : 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
  • 可写权限 - w : 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.

演示

如果进入一个目录只需要一种权限就是可执行权限 x

image-20221130184004531

如果进入一个目录没有 w 权限则不能在目录中创建文件

image-20221130184304849

对于目录来讲在没有r权限的目录下无法查看当前目录下的文件名和文件属性

image-20221130184943438

六、默认权限

权限起始分为三部分

  • 默认权限也就是我们看到的文件和目录一创建就有的权限。
  • 起始权限系统设定的权限
  • 最终权限系统为了更好的控制文件权限系统会有默认的 权限掩码 的概念(umask)起始文件和权限掩码进行计算后得到最终权限。

补充说明

  1. 普通文件起始权限666开始目录文件的起始权限777。它们默认都是八进制表示的。

  2. Linux 上权限掩码可以用 umask 指令查看

[lx@VM-4-3-centos mydir]$ umask
0002

我们看待权限掩码 0002 时看后三位002这三位是八进制序列一个八进制位是3个二进制位翻译成二进制序列000 000 010。第一位暂时不用管咱们现在用不着。

  1. 权限掩码特性在起始权限中去掉在权限掩码 umask 中出现的权限不能影响其他任何权限。意思就是说只要在 umask 中出现的权限在 最终权限 里就不能出现

那么 最终权限 是怎么计算出来的呢

其实这时有一个计算公式的最终权限 = 起始权限 & (~umask) (起始权限的值按位与 取反后的权限掩码)

举个例子比如我新建一个文件

image-20221130192955016

它的权限rw-rw-r--翻译成八进制就是 664而翻译成二进制序列就是 110 110 100

			  起始权限110 110 110
			  权限掩码000 000 010
		   权限掩码取反111 111 101
起始权限 & 权限掩码取反 = 110 110 110
					   111 111 101 &
					   -----------
					   110 110 100 = 创建文件的最终权限

拓展

我们再修改一下 umask 的值

[lx@VM-4-3-centos lesson5]$ umask 0007

这种情况下我们创建的文件的最终权限是什么(自己算算看算出来再继续看(* *))

答案揭晓image-20221130195156928

rw-rw-r--翻译成八进制是 660你算对了吗

七、粘滞位

粘滞位出现的背景在使用 Linux 的时候未来可能会有一些共享目录被所有的用户共享用来保存普通用户产生的临时数据使用户之间的安全更有保障。

在一台机器上可能会有多个用户

image-20221130210717926

而在 Linux 下作为一个普通用户它的家目录是只对自己开放的从lx 用户的权限只对 拥有者rwx 权限就可以看出且 所属组 和 other 没有任何权限。

而对于 共享目录 一般是由 root 用户创建由root将权限放开后供这台机器上的用户使用从而满足不同的用户在公共的目录下进行文件的增删查改。

我们这里直接 提权 创建一个 public 目录并开放权限chmod 777 public

image-20221130211937581

然后我们再做些准备工作分别使用 root lx Guldan 在 public 下创建若干文件

image-20221130212531285

假设本来 Guldan 和 lx 关系很好之前总是一起互相看文件这个行为由于在 共享目录 的前提下也都可以进行但是他们有一天闹了矛盾Guldan 把原先对 other 放开的 r 权限给全封掉了导致 lx 无法查看了

image-20221130213823499

这就导致 lx 看么看不了想写些东西声讨 Guldan 又写不进去于是 lx 想着你不让我看也不让我写那么我就删你的目录

image-20221130214106879

而我们就可以看出文件被所有人共享的时候受权限约束但是拦不住别人删我的文件

为了让大家共享文件且不让其他人随便删除别人的文件于是就有了 粘滞位

所以 Guldan 找到了 root 告状 root 就设置了粘滞位

粘滞位只能给目录添加所以 root 就使用 chmod +t publicpublic 添加了粘滞位

image-20221130214836668

(使用指令时为 a+t 意思是给三个角色都 +t但是只会把原先 other 的 x 的位置改为 t)

这就说明我们的 粘滞位 已经添加成功。

我们再试试能不能删除假设 lx 要删 Guldan 的 Guldan2 了

image-20221130215155709

听到这里我们可能会有两个疑惑

  1. 其他用户没有权限为什么能删我的文件为什么拦不住这是权限的bug吗
  2. 为什么粘滞位只能给目录添加

这两个实际上是一个问题能否在特定目录下创建或者删除文件由该目录的 w 权限决定

那么既然这样还要什么 粘滞位 我不是只要把 w 权限去掉 别人就不能删我的文件了吗

请注意这是共享目录是多人合用的如果把 w 权限去掉了这也就把普通用户在该目录下创建文件的权限也去掉了只有加上 w 权限才能让其他用户正常地使用。

而被删的问题是由目录导致的所以只能给目录添加 粘滞位

那么谈到这里当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件能被谁删除呢

  1. 超级管理员删除
  2. 该目录的所有者删除
  3. 该文件的所有者删除
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux