0


【Linux】权限管理

👑作者主页:@进击的安度因
🏠学习社区:进击的安度因(个人社区)
📖专栏链接: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而是bash,bash也是一种外壳程序。对于它们两个我们可以把它理解为 **

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组组长叫做小a,b组小b。

他们用的是不同的目录,公司的技术总监,创建了两个目录:A_code,b_code,存放他们的产品。a组代码放A_code,b组代码放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

权限权值为4,

w

权值为2,

x

权值为1。

八进制数值表示法表:

image-20221130015041526

举个例子:614

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

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

other:4 = 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

补充:

chown

chgrp

可以同时使用,格式为:

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 public

public

添加了粘滞位:

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. 该文件的所有者删除
标签: linux windows 运维

本文转载自: https://blog.csdn.net/m0_67867172/article/details/128123457
版权归原作者 进击的安度因 所有, 如有侵权,请联系我们删除。

“【Linux】权限管理”的评论:

还没有评论