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

【Linux系列】Linux 世界的通行证与守卫者:一文读懂权限的奥秘
在这里插入图片描述



🫧 励志不掉头发的内向程序员个人主页
 ✨️ 个人专栏: 《C++语言》《Linux学习》

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


👓️博主简介:

在这里插入图片描述


文章目录


前言

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

一、shell 命令以及运行原理

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

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

  • 将使用者的命令翻译给核心(kernel)处理
  • 同时,将核心的处理结果翻译给使用者
在这里插入图片描述


我们为什么不直接和 kernel 进行交流,反而是还要一个中间层呢?

  1. 方便用户操作
  2. 外壳程序保护内核

例如:
如果说你是⼀个闷骚且害羞的程序员,那 shell 就像媒婆,操作系统内核就是你们村头漂亮的且又让你心动的 MM 小花。你看上了小花,但是有不好意思直接表白,那就让你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的 bash。

在这里插入图片描述


在这里插入图片描述


我们的命令行解释器的外壳程序就是我们的 bash。

zxl@iv-ye423qlwxsqc6ikwbogx:~$ ls/bin/bash /bin/bash 

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

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

zxl@iv-ye423qlwxsqc6ikwbogx:~/lesson1$ ls zxl@iv-ye423qlwxsqc6ikwbogx:~/lesson1$ cd .. zxl@iv-ye423qlwxsqc6ikwbogx:~$ pwd
在这里插入图片描述

注意:

  • 我们所处的目录在登陆的时候默认是在家目录上的,所以这里所处的目录前面是 ~, ~ 就会消失。
zxl@iv-ye423qlwxsqc6ikwbogx:/home$ 
  • 提示符的作用就是用来分割系统和用户的区域。左边命令行是系统的,右边命令是用户的。
  • 提示符有两种,普通用户就是我们这里的 $ 符号;超级用户是用 # 来表示的。
# 超级用户 root@iv-ye423qlwxsqc6ikwbogx:~# # 普通用户 zxl@iv-ye423qlwxsqc6ikwbogx:~$ 

二、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@iv-ye423qlwxsqc6ikwbogx:~$ su root Password: root@iv-ye423qlwxsqc6ikwbogx:/home/zxl# pwd/home/zxl 
# 切换后 root 的路径改变,变成了 root 的家地址 zxl@iv-ye423qlwxsqc6ikwbogx:~$ su - Password: root@iv-ye423qlwxsqc6ikwbogx:~# pwd/root 

使用 sudo 分配权限:

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

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

zxl@iv-ye423qlwxsqc6ikwbogx:~$ sudo whoami [sudo] password for zxl: root 

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

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

2.2、Linux 权限管理

权限的理解

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

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

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

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

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

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

权限角色

Linux 中的角色有 3 个:

  1. 拥有者
  2. 所属组
  3. other

我们尝试来查看一下我们的文件。

-rw-r--r-- 1 root root 0 Sep 23 13:18 ls.txt -rw-rw-r-- 1 zxl zxl 0 Sep 23 13:17 my.txt -rw-rw-r-- 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 权限-rw-rw-r-- 1 zxl zxl 0 Sep 23 13:17 my.txt root@iv-ye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chmod u-r my.txt--w-rw-r-- 1 zxl zxl 0 Sep 23 13:17 my.txt # 让 my.txt 文件的所属组权限中 w 权限禁止:g-w--w-rw-r-- 1 zxl zxl 0 Sep 23 13:17 my.txt root@iv-ye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chmod g-w my.txt--w-r--r-- 1 zxl zxl 0 Sep 23 13:17 my.txt # 让 my.txt 文件的 other 权限中 w 权限支持:g-w--w-r--r-- 1 zxl zxl 0 Sep 23 13:17 my.txt root@iv-ye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chmod o+w my.txt--w-r--rw- 1 zxl zxl 0 Sep 23 13:17 my.txt 

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

读权限取消:

在这里插入图片描述


写权限取消:

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

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

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

2. chown

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

例如:

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

3. chgrp

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

例如:

-r--rw-r-- 1 root zxl 0 Sep 23 13:17 my.txt root@iv-ye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chgrp root my.txt-r--rw-r-- 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--rw-r-- 1 root root 0 Sep 23 13:17 my.txt root@iv-ye423qlwxsqc6ikwbogx:/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@iv-ye423qlwxsqc6ikwbogx:/home/zxl/lesson1# chmod 664 my.txt-rw-rw-r-- 1 root root 0 Sep 23 13:17 my.txt 

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

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

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

zxl@iv-ye423qlwxsqc6ikwbogx:/home$ umask 0002 

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

4. umask

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

目录文件

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

目录 “ r ” 权限:

drwxrwxr-x 2 zxl zxl 4096 Sep 23 13:18 lesson1/ zxl@iv-ye423qlwxsqc6ikwbogx:~$ chmod u-r lesson1 d-wxrwxr-x 2 zxl zxl 4096 Sep 23 13:18 lesson1/ zxl@iv-ye423qlwxsqc6ikwbogx:~$ cd lesson1 zxl@iv-ye423qlwxsqc6ikwbogx:~/lesson1$ lsls: cannot open directory '.': Permission denied 

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

目录 “ w ” 权限:

drwxrwxr-x 2 zxl zxl 4096 Sep 23 13:18 lesson1/ zxl@iv-ye423qlwxsqc6ikwbogx:~$ chmod u-w lesson1 dr-xrwxr-x 2 zxl zxl 4096 Sep 23 13:18 lesson1/ zxl@iv-ye423qlwxsqc6ikwbogx:~$ cd lesson1 zxl@iv-ye423qlwxsqc6ikwbogx:~/lesson1$ touch test.txt touch: cannot touch 'test.txt': Permission denied 

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

目录 “ x ” 权限:

drwxrwxr-x 2 zxl zxl 4096 Sep 23 13:18 lesson1/ zxl@iv-ye423qlwxsqc6ikwbogx:~$ chmod u-x lesson1 drw-rwxr-x 2 zxl zxl 4096 Sep 23 13:18 lesson1/ zxl@iv-ye423qlwxsqc6ikwbogx:~$ 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@iv-ye423qlwxsqc6ikwbogx:~/lesson1$ rm-f ls.txt zxl@iv-ye423qlwxsqc6ikwbogx:~/lesson1$ ls my.txt temp.txt 

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

粘滞位

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

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

root@iv-ye423qlwxsqc6ikwbogx:/# mkdir test drwxr-xr-x 2 root root 4096 Sep 23 17:15 test/ root@iv-ye423qlwxsqc6ikwbogx:/# chmod 777 test drwxrwxrwx 2 root root 4096 Sep 23 17:15 test/

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

root@iv-ye423qlwxsqc6ikwbogx:/test# touch temp2.txt-rw-r--r-- 1 root root 0 Sep 23 17:18 temp2.txt -rw-rw-r-- 1 zxl zxl 0 Sep 23 17:17 temp.txt 

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

-rw-r--r-- 1 root root 0 Sep 23 17:18 temp2.txt -rw-rw-r-- 1 zxl zxl 0 Sep 23 17:17 temp.txt zxl@iv-ye423qlwxsqc6ikwbogx:/test$ rm-f temp2.txt zxl@iv-ye423qlwxsqc6ikwbogx:/test$ ls temp.txt 

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

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

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

-rw-r--r-- 1 root root 0 Sep 23 17:23 temp2.txt -rw-rw-r-- 1 zxl zxl 0 Sep 23 17:17 temp.txt zxl@iv-ye423qlwxsqc6ikwbogx:/test$ rm-f temp2.txt rm: cannot remove 'temp2.txt': Operation not permitted 

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

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

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


总结

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

🎇坚持到这里已经很厉害啦,辛苦啦🎇ʕ • ᴥ • ʔづ♡ど

Read more

解锁动态规划的奥秘:从零到精通的创新思维解析(3)

解锁动态规划的奥秘:从零到精通的创新思维解析(3)

解锁动态规划的奥秘:从零到精通的创新思维解析(3) 前言: 小编在前几日书写了关于动态规划习题的博客(PS:其实这些都是我的存稿,我已经好久没写博客了截止到现在,确实摆烂),今天各位继续跟着小编的步伐,走进动态规划的世界,接下来我们将会·讲述一个比较新的动态规划问题:路径问题。 正文: 1.不同路径 1.1.题目来源 本题和之前的题目一样,都是来自于力扣,下面小编给上链接:62. 不同路径 - 力扣(LeetCode) 1.2.题目解析 和之前的规矩一样,小编先给各位分析一下题目到底想要传达给我们什么信息,其实本题也是很好理解的,这个题目就像我们小学做过的益智游戏一样,此时给定我们一个机器人,此时我们从左上角开始走,想要我们求解走到右下角的方法有几种,此时我们选择往右走,也可以选择往下走,只要走到右下角即可。这就是一个典型的路径问题,通过动态规划我们就可以轻易解决此类问题,下面小编进入本题的思路讲解部分。 1.3.思路讲解 对于动态规划的题目,我们首先需要先设置好一个dp表用于存放数据,此时根据题目分析我们可以知道此时我们需要设置一个二维的dp表,

By Ne0inhk

代码随想录算法训练营第三十四天| 研究携带材料、416. 分割等和子集

题目链接:携带研究材料 解题思路:动态规划(二维) 具体思路: 首先读取物品数量 m 和背包容量 n,再分别读取 m 个物品的重量数组 weight 和价值数组value,接着初始化一个 m * (n + 1) 的二维 dp 数组,dp[i][j] 表示前 i + 1个物品放入容量为j的背包能获得的最大价值,并初始化第一行当背包容量 j 大于等于第一个物品重量时,dp[0][j] 赋值为第一个物品的价值,然后通过双层循环遍历剩余物品和所有容量,若当前容量 j 小于第 i 个物品重量,则无法放入该物品,dp[i][j] 等于上一行同列的值,即不选该物品的最大价值,否则取不选该物品dp[i -

By Ne0inhk
排序算法全解,为什么快排的时间波动特别大?

排序算法全解,为什么快排的时间波动特别大?

目录 排序算法全解,为什么快排的时间波动特别大? 一、总览与对比分析 二、快速排序 1、核心思想 2、算法特点 3、示例 三、归并排序 1、核心思想 2、算法特点 3、示例 四、堆排序 1、核心思想 2、算法特点 3、示例 五、排序方法对比与其他排序 六、总结         作者:watermelo37         ZEEKLOG全栈领域优质创作者、万粉博主、华为云云享专家、阿里云专家博主、腾讯云“创作之星”特邀作者、支付宝合作作者,全平台博客昵称watermelo37。         一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。

By Ne0inhk

基于遗传算法的LQR控制器最优设计算法

线性二次调节器(LQR)是控制理论中重要的设计方法,而遗传算法(GA)为LQR控制器的优化设计提供了强大的全局搜索能力。 LQR控制器基本原理 LQR控制器通过最小化代价函数设计最优状态反馈增益矩阵: J=∫(xTQx+uTRu)dtJ = ∫(xᵀQx + uᵀRu)dtJ=∫(xTQx+uTRu)dt 其中: * Q≥0Q ≥ 0Q≥0:状态加权矩阵 * R>0R > 0R>0:控制输入加权矩阵 * u=−Kxu = -Kxu=−Kx:状态反馈控制律 传统方法通过求解代数RiccatiRiccatiRiccati方程获得最优增益矩阵KKK: K=R−1BTPK = R⁻¹BᵀPK=R−1BTP AP+PAT−PBR−1BTP+Q=

By Ne0inhk