• 【Linux】权限管理


    在这里插入图片描述

    ​📝个人主页:@Sherry的成长之路
    🏠学习社区:Sherry的成长之路(个人社区)
    📖专栏链接:Linux
    🎯长路漫漫浩浩,万事皆有期待

    1.shell 命令以及运行原理

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

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

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

    shell 是什么?

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

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

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

    那么我们如何理解 shell ?

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

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

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

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

    总结:shell 是外壳程序,包裹在操作系统外层的软件层,为命令行解释/操作解释,将用户的操作解释交给操作系统,让操作系统执行,执行完毕,将结果经过shell再传递给用户。

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

    在这里插入图片描述

    使用ls /usr/bin/bash -a ,显示的并不是shell而是bash,bash也是一种外壳程序。因为bash是 centos 上的外壳程序,而 shell 是 外壳程序 的统称。

    2.Linux的用户权限

    1、权限概念引入
    生活中, 权限处处存在。比如腾讯视频,有些视频是vip才能看的;打游戏的时候,有些皮肤是需要钱买的,这些都是对人的限制。

    有时访问的对象可能天然就没有这种“属性”。比如我想咬一口磁盘上的文件,这是不可能的。因为该事物没有这一层属性。所以我们基本可以得出结论: 权限 = 人 + 事物属性

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

    2、用户分类
    Linux上,有两种用户:root(超级用户) 和 普通用户。

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

    3、用户切换
    命令:su 用户名

    功能:切换用户

    对于 root用户来说,使用 su 普通用户 可以直接切换到普通用户:
    在这里插入图片描述

    但是对于普通用户来说,使用 su 指令时,会要求输入 root 用户的密码:
    在这里插入图片描述

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

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

    对于 su:
    在这里插入图片描述

    对于 su -:
    在这里插入图片描述

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

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

    若出现了报错:Permission denied,意思是权限被拒绝。

    面对这种情况可以 单条指令进行暂时提权:
    在这里插入图片描述

    对于提权就要用到 sudo 指令,但是这个需要配置一下,不会配置的同学可以跳转到这篇博客【Linux】普通用户无法使用sudo指令的方法

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

    在这里插入图片描述

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

    3.Linux 权限管理

    对于 Linux 的权限管理,我们主要围绕一张图进行学习:

    在这里插入图片描述

    3.1. 文件访问者的角色划分

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

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

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

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

    在某个公司当中有两个小组团队(A组、B组)在同一个Linux服务器上进行着同一款项目的开发(赛马机制),而张三是A组当中的一员。

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

    所以 Linux 引入了 所属组 的概念,让拥有者为组内成员开放权限,给组里的人看,其他人还是other,其他人看不了。这样子权限安全问题就减少了。更灵活的进行权限配置,满足团队协作。

    梳理一下 用户 和 文件访问者的关系:

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

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

    3.2. 文件类型和访问权限

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

    在这里插入图片描述

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

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

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

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

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

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

    在这里插入图片描述

    程序可以跑过,那么我修改一下 a.out 的文件后缀呢?
    在这里插入图片描述

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

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

    在这里插入图片描述

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

    说到这,那么我们怎么理解 Linux 中的 文件后缀 呢?

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

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

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

    比如:字符设备文件

    在这里插入图片描述

    file 指令:

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

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

    常用选项:

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

    可执行程序:
    在这里插入图片描述

    空文件:

    在这里插入图片描述

    b、文件访问权限

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

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

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

    在使用文件时,只能用一种身份对文件进行处理,比如:作为拥有者:r-- 作为所属组:rw-;虽然两个身份都是我,但此时我只能作为拥有者只读文件。除非拥有者变成其他人,我才能作为所属组读写文件。

    4.文件访问权限的更改

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

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

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

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

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

    常用选项:

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

    chmod 命令设置权限的格式:

    1. chmod u/g/o/a ±= rwx filename
      +:向权限范围增加权限代号所表示的权限
      -:向权限范围取消权限代号所表示的权限
      =:向权限范围赋予权限代号所表示的权限

    2. 用户符号:
      u:拥有者
      g:所属组
      o:其它用户
      a:所有用户

    字符表示法表:
    在这里插入图片描述

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

    在这里插入图片描述

    对多个用户的权限进行修改:chmod 用户 ±权限,用户 ±权限,…(上限三个,拥有者、所属组、other) 文件名
    在这里插入图片描述

    对全部用户进行权限修改:chmod a ± 用户权限 文件名
    在这里插入图片描述

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

    在这里插入图片描述

    chmod 三位八进制 filename

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

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

    八进制数值表示法表:
    在这里插入图片描述

    举个例子:614

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

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

    功能:修改文件的拥有者

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

    当前我的家目录有如下用户:
    在这里插入图片描述

    sherry 用户当前文件夹:
    在这里插入图片描述

    如果我想要把 file.txt 的 拥有者 从 sherry 改为Tchey_Y ,能否修改成功?
    在这里插入图片描述

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

    在 Linux 上,总不可能在你给权限的时候给别人留个言,说我给你个权限吧,毕竟白送给别人东西也需要对方接受才行。所以 普通用户是无法直接修改文件拥有者的!

    但是可以用 root 强制把文件拥有者改掉,因为 root 是超级管理员,比如使用 sudo 提权一下,然后强制改掉:

    在这里插入图片描述

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

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

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

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

    同样的,通过 sudo 提权修改:

    在这里插入图片描述

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

    比如将拥有者和所属组都改回 sherry :
    在这里插入图片描述

    4. 有无权限的区别

    首先,我将 t.txt 的权限全部去掉:
    在这里插入图片描述

    如果我现在读 t.txt:

    在这里插入图片描述

    被权限拒绝了,再也用 echo “hello” > t.txt 写入试试:

    在这里插入图片描述

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

    那么 root 呢?我们用 root 试试:
    在这里插入图片描述

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

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

    5.目录的权限

    目录权限的功能:

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

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

    在这里插入图片描述

    如果进入一个目录,没有 w 权限,则不能在目录中创建文件:
    在这里插入图片描述

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

    在这里插入图片描述

    总结:目录文件的 r 读权限不是影响我进入(cd)目录,而是影响我查看(ls)指定目录下的文件内容 ;w 写权限 影响我在当前目录下进行创建(touch),更改(mv),删除(rf)文件。x 权限:是否允许用户进入对应目录。

    6.默认权限

    权限起始分为三部分:

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

    补充说明:

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

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

    在这里插入图片描述

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

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

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

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

    举个例子,比如我新建一个文件:
    在这里插入图片描述

    它的权限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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    我们修改一下 umask 的值:

    在这里插入图片描述

    这种情况下,我们创建的文件的最终权限是什么?

    答案:
    在这里插入图片描述

    rw-rw-r–翻译成八进制是 660

    7.粘滞位

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

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

    在这里插入图片描述

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

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

    我们这里直接 提权 创建一个 public 目录,并开放权限chmod 777 public:
    在这里插入图片描述

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

    于是 sherry 想着你不让我看,那么我就删你的文件!
    在这里插入图片描述

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

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

    粘滞位只能给目录添加,所以 root 就使用 chmod +t public 给 public 添加了粘滞位:
    在这里插入图片描述

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

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

    我们再试试能不能删除:

    在这里插入图片描述

    其他用户没有权限为什么能删我的文件,这是权限的bug吗?为什么粘滞位只能给目录添加?

    能否在特定目录下,创建或者删除文件由该目录的 w 权限决定。

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

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

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

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

    超级管理员删除(root)
    该目录的所有者删除
    该文件的所有者删除

    8.总结:

    今天我们了解了Linux中的权限管理,主要学习了shell运行原理、Linux上用户权限、权限管理、更改文件访问权限、目录权限、默认权限和粘滞位等。接下来,我们将继续学习Linux的的相关知识。希望我的文章和讲解能对大家的学习提供一些帮助。

    当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

    在这里插入图片描述

  • 相关阅读:
    现代_复习_第3章:向量
    ES6空值合并运算符(??)
    IDEA中在Service中开启管理多个微服务
    永安通配符和泛域名SSL证书的区别
    前后端分离项目,vue+uni-app+php+mysql在线小说电子书阅读系统设计与实现(H5移动项目)
    在Windows或Mac上安装并运行LLAMA2
    【智能优化算法 】基于适应度相关优化器求解单目标优化问题附matlab代码
    Easex样式样式
    积分体系和营销活动结合在一起有哪些玩法
    Jmeter —— 常用的几种断言方法(基本用法)
  • 原文地址:https://blog.csdn.net/m0_73258399/article/details/130653650