欢迎光临
我们一直在努力

【Linux系列】Linux 世界的通行证与守卫者:一文读懂权限的奥秘

在这里插入图片描述

🫧 励志不掉头发的内向程序员:个人主页

 ✨️ 个人专栏: 《C++语言》《Linux学习》

🌅偶尔悲伤,偶尔被幸福所完善


👓️博主简介:

在这里插入图片描述

文章目录

  • 前言
  • 一、shell 命令以及运行原理
  • 二、Linux 权限的概念
    • 2.1、Linux 用户
    • 2.2、Linux 权限管理
      • 权限的理解
      • 权限角色
      • 普通文件访问权限的相关设置方法及讲解
      • 目录文件
      • 粘滞位
  • 总结

前言

本章节我们来聊聊我们 Linux 系统中的权限问题,让我们明白 Linux 中的权限是什么,为什么要有权限,以及怎么操作我们的权限,我们一起来看看吧。

在这里插入图片描述


一、shell 命令以及运行原理

Linux 严格意义上说的是一个操作系统,我们称之为 “核心(kernel)“,但我们一般用户,不能直接使用 kernel。而是通过 kernel 的 “外壳” 程序,也就是所谓的 shell,来与 kernel 沟通。如何理解?为什么不能直接使用 kernel?

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

  • 将使用者的命令翻译给核心(kernel)处理

  • 同时,将核心的处理结果翻译给使用者

在这里插入图片描述 我们为什么不直接和 kernel 进行交流,反而是还要一个中间层呢?

  • 方便用户操作
  • 外壳程序保护内核
  • 例如: 如果说你是⼀个闷骚且害羞的程序员,那 shell 就像媒婆,操作系统内核就是你们村头漂亮的且又让你心动的 MM 小花。你看上了小花,但是有不好意思直接表白,那就让你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的 bash。 在这里插入图片描述 在这里插入图片描述 我们的命令行解释器的外壳程序就是我们的 bash。

    zxl@ivye423qlwxsqc6ikwbogx:~$ ls /bin/bash
    /bin/bash

    我们的系统启动成功后都会给我们分配一个 bash 程序。它就是用来不断进行命令行解释,做命令的分析和执行的。 当然,刚才我们说外壳程序是 Shell,但是此时变成了 bash。其实我们 bash 是 Shell 的一种,我们 Shell 是我们外壳程序的统称。我们 Linux 中具体的 Shell 的名称就叫 bash。

    我们用户通过发送指令给 Shell,Shell 把指令加工翻译后传给核心去执行后再把核心的处理结果加工翻译成我们好理解的方式输出出来。所以我们在了解完指令之后就得来了解了解 Shell 这个命令行解释器。 以下在 $ 前面(包含 $)就是我们的命令行,而 $ 后面(不包含 $)就是我们的指令。

    zxl@ivye423qlwxsqc6ikwbogx:~/lesson1$ ls
    zxl@ivye423qlwxsqc6ikwbogx:~/lesson1$ cd ..
    zxl@ivye423qlwxsqc6ikwbogx:~$ pwd

    在这里插入图片描述

    注意:

    • 我们所处的目录在登陆的时候默认是在家目录上的,所以这里所处的目录前面是 ~, ~ 就会消失。

    zxl@ivye423qlwxsqc6ikwbogx:/home$

    • 提示符的作用就是用来分割系统和用户的区域。左边命令行是系统的,右边命令是用户的。
    • 提示符有两种,普通用户就是我们这里的 $ 符号;超级用户是用 # 来表示的。

    # 超级用户
    root@ivye423qlwxsqc6ikwbogx:~#
    # 普通用户
    zxl@ivye423qlwxsqc6ikwbogx:~$

    二、Linux 权限的概念

    2.1、Linux 用户

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

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

    这个我们不难理解,因为我们在 windows 中也有类似的权限,比如我们的管理员(admin)权限和普通用户。 在 Linux 权限越高,受管控就越少,如果是 root,那就不受管控了。

    我们在 Linux 中可以进行用户切换:

    命令:su [用户名] 功能:切换用户 切换回来:ctrl + d 例如:要从 root 用户切换到普通用户 user,则使用 su user。要从普通用户 user 切换到 root 用户则使⽤ su root(root可以省略),此时系统会提示输入 root 用户的口令(密码),输入的密码是不会回显的。超级用户变成普通用户不用输入口令(密码)

    在这里插入图片描述

    我们没事为什么要切换用户呢?这是因为我们权限越高,越不受管控,此时我们就很容易误操作,严重的可能会导致我们的 Shell 直接崩溃了(我们 Linux 中的文件删了就直接消失了,不会像 windows 还有回收站可以恢复)。我们平时工作时就可以使用权限低的用户,等需要我们权限高的时再权限切换来操作。 我们的 su 命令后面可以接 -。它也是切换到超级用户。和 su root 的区别在于 su root 只是身份的切换,但是 su – 相当于让我们的 root 重新登陆。

    # 此时我们切换后 root 的地址和之前是一样的
    zxl@ivye423qlwxsqc6ikwbogx:~$ su root
    Password:
    root@ivye423qlwxsqc6ikwbogx:/home/zxl# pwd
    /home/zxl

    # 切换后 root 的路径改变,变成了 root 的家地址
    zxl@ivye423qlwxsqc6ikwbogx:~$ su
    Password:
    root@ivye423qlwxsqc6ikwbogx:~# pwd
    /root

    使用 sudo 分配权限:

    我们上面的操作可以切换我们的用户,这很好。但是在我们日常中,我们公司不可能会给你 root 账号的密码,但是我们有时又不得不用 root 权限改怎么办呢?(比如下载插件必须使用 root 才能下载)

    此时我们可以使用 sudo + 命令 来对我们的指令进行提权。在第一次使用 sudo 时我们得输入自己的密码(输入密码不回显,在一段时间内不用再输入密码)。此时我们就能把当前指令提权,变成 root 输入的指令。

    zxl@ivye423qlwxsqc6ikwbogx:~$ sudo whoami
    [sudo] password for zxl:
    root

    此时我们可以看到,我们的这条指令变成 root 输入的了。此时有人可能会有疑问,那不是什么人都可以直接使用 root 了,反正只要输入自己的密码,以后每次写指令时加多一个 sudo 不就行了。

    实则不然,我们想要用 sudo 也得让 root 给你权限你才可以使用,否则系统就会禁止你的操作。

    2.2、Linux 权限管理

    权限的理解

    在现实生活中,我们总会碰到权限不足的情况。比如:看视频没有 vip 权限而看不了、查资料权限不足导致看不了、去某些场所也会因为权限不够而被拒之门外等。

    也就是说所谓的权限本质:能或者不能做什么事情。

    那我们为什么要有权限呢?

    因为权限可以控制用户行为,防止错误发生。

    我们日常生活中,可能会有各种各样的权限,但是权限不是给我们本身的,我们本身不管获得什么权限都不会发生改变,改变的是我们的角色。不是因为是张三所以能去校长室,而是因为张三是校长这个角色才有这个权限。 当然,我们的一个权限不是万能的,如果它没有相应的属性,也就哪怕有这个权限也无用,比如你有爱奇艺的权限,但是你不可能在爱奇艺上打代码,因为没有相关的属性。

    综上我们可以得出: 权限 = 角色 + 目标属性 在我们 Linux 中,我们一切皆文件。我们文件无非具备读、写、执行三个属性。

    权限角色

    Linux 中的角色有 3 个:

  • 拥有者
  • 所属组
  • other
  • 我们尝试来查看一下我们的文件。

    rwr-r- 1 root root 0 Sep 23 13:18 ls.txt
    rwrwr- 1 zxl zxl 0 Sep 23 13:17 my.txt
    rwrwr- 1 zxl zxl 26 Sep 12 20:34 temp.txt

    在这里插入图片描述

    这里的拥有者和所属组和刚才的 root、zxl 等有什么区别呢?

    我们的拥有者和所属组相当于我们的角色,而 root、zxl 相当于具体的人。它们是不冲突的,是相互补充的。

    上面没有出现 other,其实我们 other 不需要记录,不是拥有者和所属组,那就是 other 了。我们的 other 是非常多的,所以就没记录下来。

    我们的拥有者比较好理解,那就是这个文件是谁创建的,属于谁的,那就是拥有者。不是拥有者,不是所属组那就是 other。那我们的所属组是什么?

    其实很简单,如果我们在一个公司,但是却在不同的组中,我们如果没有所属组,当我们想要把我们的文件给别人看的时候,就必须把 other 权限放开,此时我们不但可以给好朋友看,还会给我们的竞争对手看,此时就非常不好。所以此时就有一个所属组,用来给我们的朋友权限。

    我们 Linux 中无非三种权限:

    • 读:在 Linux 中用 “ r ” 表示
    • 写:在 Linux 中用 “ w ” 表示
    • 可执行:在 Linux 中用 “ x ” 表示

    在这里插入图片描述 我们文件类型之前说过,这里就不说了 – 是普通文件。后面有 9 个字符,3 个为一组,分别代表这个文件赋予拥有者、所属组、other 的权限。 这三个位置分别对应

    权限第一个位置第二个位置第三个位置
    “-” 无读权限 无写权限 无可执行权限
    r / w / x 允许读 允许写 允许执行

    我们上面的拥有者的权限就是可读可写不可执行。

    普通文件访问权限的相关设置方法及讲解

    我们粗略了解完了权限,那我们的权限应该怎么设置呢,文件的权限不同会这么样呢?

    1. chmod

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

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

    • 说明:只有文件的拥有者或 root 才可以改变文件的权限

    • 常用选项:R: 递归修改目录文件的权限

    • chmod 命令权限值的格式:用户表示符 +/- = 权限字符 +:向权限范围增加权限代号所表示的权限 -:向权限范围取消权限代号所表示的权限 =:向权限范围赋予权限代号所表示的权限

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

    例如:

    # 让 my.txt 文件的拥有者权限中 r 权限禁止:u-r
    # u 表示拥有者的用户符号,r 表示读的权限,-r 就是取消 r 权限
    rwrwr- 1 zxl zxl 0 Sep 23 13:17 my.txt
    root@ivye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chmod u-r my.txt
    wrwr- 1 zxl zxl 0 Sep 23 13:17 my.txt

    # 让 my.txt 文件的所属组权限中 w 权限禁止:g-w
    wrwr- 1 zxl zxl 0 Sep 23 13:17 my.txt
    root@ivye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chmod g-w my.txt
    wr-r- 1 zxl zxl 0 Sep 23 13:17 my.txt

    # 让 my.txt 文件的 other 权限中 w 权限支持:g-w
    wr-r- 1 zxl zxl 0 Sep 23 13:17 my.txt
    root@ivye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chmod o+w my.txt
    wr-rw 1 zxl zxl 0 Sep 23 13:17 my.txt

    如果我们这里把我们的权限取消掉了,此时我们就不能进行相应的操作:

    读权限取消: 在这里插入图片描述 写权限取消: 在这里插入图片描述

    这里我们发现,我们虽然拥有者权限没了,但是我们还有所属组啊,我们所属组是有权限的,为什么这里却不行呢

    我们 Linux 中,用户角色确定只确定一次,顺序是:拥有者 -> 所属组 -> other。一旦确认了,就不会改了。当然,我们 root 角色是不受这些权限影响的,不管我们有没有给 root 权限,我们 root 都可以进行读、写、可执行的权限操作。

    除了可以修改权限外,我们还可以修改文件的拥有者和所属组。

    2. chown

    • 功能:修改文件的拥有者
    • 格式:chown [参数] 用户名 文件名

    例如:

    r-rwr- 1 zxl zxl 0 Sep 23 13:17 my.txt
    root@ivye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chown root my.txt
    r-rwr- 1 root zxl 0 Sep 23 13:17 my.txt

    3. chgrp

    • 功能:修改文件或目录的所属组
    • 格式:chgrp [参数] 用户组名 文件名
    • 常用选项:-R 递归修改文件或目录的所属组

    例如:

    r-rwr- 1 root zxl 0 Sep 23 13:17 my.txt
    root@ivye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chgrp root my.txt
    r-rwr- 1 root root 0 Sep 23 13:17 my.txt

    当然,我们不能够随便把我们的文件给别人,如果是垃圾文件或者 bug 文件给别人会很困扰。所以想给别人文件除非是高权限的人给,否则是不行的。

    我们知道读和写的权限,我们的可执行权限是什么意思呢,我们该怎么理解可执行呢?

    它的含义是我们这个文件是可以去执行的,就行我们之前的代码那样是可以运行的。但是这不代表我们给了它权限它就一定能运行起来,我们的代码还有出问题而报错导致无法运行的时候呢,何况我们的文件。我们后面回学习开发文件,我们后面再讲文件怎么运行。

    想要修改我们的权限位的权限还有一种办法。我们细心一点就可以发现,我们的每个权限位只有两态,就是有权限和无权限。我们可以把它的权限位看成 1/0。rw_ -> 110;r__ -> 100;___ -> 000。1 就是这个位置有对应的权限,0就是这个位置没有对应的权限。当然二进制对用户不是很友好,那我们可以转化成八进制。rw_ -> 6;r__-> 4; _-> 0;一个文件正常的权限 rw_rw_r 就可以表示为 664。

    此时我们修改权限就可以这样修改: 改成_________:

    r-rwr- 1 root root 0 Sep 23 13:17 my.txt
    root@ivye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chmod 000 my.txt
    1 root root 0 Sep 23 13:17 my.txt

    改成rw_rw_r__:

    1 root root 0 Sep 23 13:17 my.txt
    root@ivye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chmod 664 my.txt
    rwrwr- 1 root root 0 Sep 23 13:17 my.txt

    会比我们之前一个一个改方便很多。

    为什么我们新建文件时权限为什么不是 000?

    我们在创建文件时,对于普通文件默认权限 = 0666;目录文件默认权限 = 0777,但是我们实际上创建普通文件的权限值为 0664;目录文件默认权限 = 0775。这是因为系统会默认出现一个权限野码的概念。

    zxl@ivye423qlwxsqc6ikwbogx:/home$ umask
    0002

    假设默认权限是 mask,则实际创建的出来的文件权限是: mask & ~umask

    4. umask

    • 功能:查看或修改文件掩码
    • 格式:umask 权限值
    • 说明:将现有的存取权限减去权限掩码后,即可产⽣建立文件时预设权限。超级用户默认掩码值为 0022,普通用户默认为 0002。
    • 意义:系统可配置,可以灵活满足需要的一种表现。可以控制文件的默认权限,让我们的代码都是可控的。

    目录文件

    以上都是普通文件,我们目录文件的不同权限会产生什么样的影响呢?

    目录 “ r ” 权限:

    drwxrwxrx 2 zxl zxl 4096 Sep 23 13:18 lesson1/

    zxl@ivye423qlwxsqc6ikwbogx:~$ chmod ur lesson1

    dwxrwxrx 2 zxl zxl 4096 Sep 23 13:18 lesson1/

    zxl@ivye423qlwxsqc6ikwbogx:~$ cd lesson1
    zxl@ivye423qlwxsqc6ikwbogx:~/lesson1$ ls
    ls: cannot open directory '.': Permission denied

    此时目录没有了 r 权限,还是可以进入我们目录内,但是没办法读取目录里面的内容了。

    目录 “ w ” 权限:

    drwxrwxrx 2 zxl zxl 4096 Sep 23 13:18 lesson1/

    zxl@ivye423qlwxsqc6ikwbogx:~$ chmod uw lesson1

    drxrwxrx 2 zxl zxl 4096 Sep 23 13:18 lesson1/
    zxl@ivye423qlwxsqc6ikwbogx:~$ cd lesson1
    zxl@ivye423qlwxsqc6ikwbogx:~/lesson1$ touch test.txt
    touch: cannot touch 'test.txt': Permission denied

    此时目录没有了 w 权限,可以进入目录,也可以查看,但是却无法对目录进行修改。

    目录 “ x ” 权限:

    drwxrwxrx 2 zxl zxl 4096 Sep 23 13:18 lesson1/

    zxl@ivye423qlwxsqc6ikwbogx:~$ chmod ux lesson1

    drwrwxrx 2 zxl zxl 4096 Sep 23 13:18 lesson1/
    zxl@ivye423qlwxsqc6ikwbogx:~$ cd lesson1
    bash: cd: lesson1: Permission denied

    此时目录没有了 x 权限,无法进入我们的目录。

    当然,这些权限对 root 没有任何作用,无论有没有权限,root 都是可以随意进出和访问的。

    注意: 我们 Linux 多用户之间就是通过权限进行隔离。我们在 Linux 中创建一个用户,此时就会在家目录中创建一个以你的名字命名的目录,它的拥有者是你,除了拥有者有访问权限,所属组和 other 都没有任何权限。

    drwx- 6 zxl zxl 4096 Sep 23 13:15 zxl/

    我们再来看一个现象:

    1 root root 0 Sep 23 13:18 ls.txt
    zxl@ivye423qlwxsqc6ikwbogx:~/lesson1$ rm f ls.txt
    zxl@ivye423qlwxsqc6ikwbogx:~/lesson1$ ls
    my.txt temp.txt

    我们的角色对 ls 是没有任何权限的,甚至拥有者和所属组都不是我。但是我却可以把它删了。这是因为一个文件是否可以删除取决于这个目录是不是我的。不可能别人在我们的目录下随意创建文件,我还不能删除。

    粘滞位

    我们在日常生活中肯定少不了合作的需求,我们如果需要进行合作,此时就免不了要共同使用一个文件,但是此时如果我们在我们的目录中创建一个目录去供别人使用,就不是很好,此时我们应该怎么办呢?

    此时我们可以在根目录中创建一个目录,这个目录就是供大家使用的,此时我们就可以在这个目录中进行合作啦。

    root@ivye423qlwxsqc6ikwbogx:/# mkdir test
    drwxrxrx 2 root root 4096 Sep 23 17:15 test/
    root@ivye423qlwxsqc6ikwbogx:/# chmod 777 test
    drwxrwxrwx 2 root root 4096 Sep 23 17:15 test/

    此时无论是谁都可以进入我们的合作目录中去合作了。

    root@ivye423qlwxsqc6ikwbogx:/test# touch temp2.txt
    rwr-r- 1 root root 0 Sep 23 17:18 temp2.txt
    rwrwr- 1 zxl zxl 0 Sep 23 17:17 temp.txt

    但是此时会出现一个问题,那就是这些文件无论是谁都可以删除,因为我们文件操作是和我们目录权限是有关的,但是我们目录如果不允许删别人的话就没办法给别人使用了。

    rwr-r- 1 root root 0 Sep 23 17:18 temp2.txt
    rwrwr- 1 zxl zxl 0 Sep 23 17:17 temp.txt
    zxl@ivye423qlwxsqc6ikwbogx:/test$ rm f temp2.txt
    zxl@ivye423qlwxsqc6ikwbogx:/test$ ls
    temp.txt

    此时我们就要用到我们的粘滞位了。

    root@ivye423qlwxsqc6ikwbogx:/# chmod +t test #+t 就表示给文件增加一个粘滞位
    drwxrwxrwt 2 root root 4096 Sep 23 17:20 test/

    此时我们还想要去删除别人的文件就做不到了。

    rwr-r- 1 root root 0 Sep 23 17:23 temp2.txt
    rwrwr- 1 zxl zxl 0 Sep 23 17:17 temp.txt

    zxl@ivye423qlwxsqc6ikwbogx:/test$ rm f temp2.txt
    rm: cannot remove 'temp2.txt': Operation not permitted

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

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

    我们粘滞位只能给需要共享的目录添加。


    总结

    以上便是我们 Linux 权限的内容啦,权限的存在使我们的 Linux 中的文件受到各种保护,如果我们乱用可能会使我们的文件被别人损坏,所以我们一定要了解清楚,好好学习。

    在这里插入图片描述

    🎇坚持到这里已经很厉害啦,辛苦啦🎇

    ʕ • ᴥ • ʔ

    づ♡ど

    赞(0)
    未经允许不得转载:171主机测评 » 【Linux系列】Linux 世界的通行证与守卫者:一文读懂权限的奥秘
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址