欢迎光临
我们一直在努力

【Linux】权限的详细讲解

一、Linux 权限的概念

1.1 用户分类

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

  • 超级用户:可以在 Linux 系统下做任何事情,几乎不受权限的限制;
  • 普通用户:在 Linux 下做权限范围内的事情;
  • 超级用户的命令提示符是 #,普通用户的命令提示符是 $。

在这里插入图片描述

1.2 切换用户

Linux 切换用户的指令是 su。

在 Linux 中,如果我们要从超级用户切换到普通用户,直接 su username 即可,没有任何限制:

在这里插入图片描述

但是如果我们要从普通用户切换到超级用户,就需要输入 root 密码。普通用户切换到 root 用户有两种方式:

  • su:切换到 root 目录不变;
  • su -:直接切换到 root 的根目录。
  • 注:Linux 出于安全考虑,从键盘输入的密码在终端上是不会回显的,也就是说我们输入密码时屏幕不会显示任何东西。

    在这里插入图片描述

    1.3 用户提权

    在工作中使用 Linux 的时候,可能会出现这样一种状况:当前有一条指令必须拥有超级用户的权限才能执行,但我们不想切换用户,想直接让普通用户以 root 用户的身份去执行该指令。

    sudo 指令可以满足我们的需求。

    但是我们执行 sudo 指令发现了两个奇怪的现象:

    在这里插入图片描述

  • 使用 sudo 指令让我们拥有 root 用户的权限,按理来说应该提示我们输入 root 密码,但事实是它让输入我们自己用户的密码;
  • 以 test 的身份执行 sudo 指令,它提示 test 用户不在 sudoers file 内,sudo 失败(如果我们不在 sudoers 文件中,自然也不能通过 sudo 指令提权,后面讲 vim 的时候一起解决)。
  • 上面这些现象是由 sudo 的机制造成的:sudo 存在的目的是为了给受信任的用户提供最少的执行障碍,受信任的用户是指被添加到 sudoers 文件中的用户。也就是说,当我们存在于 sudoers 文件中时,说明 root 用户充分信任我们,所以当我们使用 sudo 指令提升权限时只需要输入自己的密码即可。

    注:sudo 的有效时间为 15 分钟,即当我们使用 sudo 提权成功后,后面 15 分钟内再次使用 sudo 指令不需要再次输入密码。

    二、Linux 权限管理

    2.1 引入

    权限即你是否可以做这件事情,比如:听 VIP 歌曲的时候,只有 VIP 身份的用户才可以听,普通身份用户无法听。

    权限认证和身份(人)与属性有关。

    • 权限的认证跟身份有关(权限也和人有关)。比如:网易云 VIP 音乐关心的是你是否是 VIP,这跟你的身份有关。
    • 权限的认证还跟事物的属性有关。例如:你想在网易云上听周杰伦的《反方向的钟》,尽管你有 VIP 可以听网易云音乐上所有的歌曲,可是网易云上买不到《反方向的钟》的版权,网易云不能满足你的要求,那么你在网易云上就没有听这首歌的权限。这个事物的属性要满足你想要做的事情,你才能有对应的权限。

    2.2 文件访问者的分类

    在 Linux 下,文件的访问者被分为三类:

    • 所有者:文件和文件目录的所有者 —— u(user);
    • 所属组:文件和文件目录的所有者所在的组的用户 —— g(group);
    • 其他用户:除所有者和所属组用户之外的用户 —— o(other)。

    关于文件的所有者和其他用户相信大家都很容易理解,但是为什么会有一个所属组呢?我们以一个例子说明:

    假设一家刚起步的很穷的公司要开发一款产品,老板奉行竞争理念,所以他把手下的人分为了两个组,让他们来研发同一款产品,最后哪个组的产品更优,哪个组就拿额外的奖金。

    但是由于公司很穷,只买得起一台主机,这时候问题就出现了:两个组的成员共用一台主机,那么组内成员的代码如何进行共享呢?

    如果我把文件设置为私有,这样虽然另外一组的人看不到我的代码,但同时我的队友也看不到;而如果我把文件设置为公有,那么又可能有代码泄露的风险。

    为了解决这种情况,Linux 设计出了所属组的概念:我们可以把多个用户归为一个组,让组内的成员共享文件,组外的成员则受权限限制。

    2.3 文件类型和访问权限

    我们在 Linux 中查看一个文件/目录时,文件前面通常会出现很长一串字符:

    在这里插入图片描述

    它们对应的含义如下:

    在这里插入图片描述

    第一个字符代表文件类型,后面九个字符三三一组,分别代表文件拥有者、所属组和其他用户的权限。文件的权限一共分为三类:

    • r – 读权限(Read):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限;
    • w – 写权限(Write):对文件而言,具有修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限;
    • x – 可执行权限(execute):对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限。

    注:对应位置上有代表权限的字符说明该用户拥有对应权限,如果显示 – 则代表该用户没有对应权限。

    在这里插入图片描述

    1. 文件类型

    Linux 中一共有七种文件:

    • d:目录;
    • -:普通文件(可执行程序也属于普通文件);
    • l:软链接(类似 Windows 的快捷方式);
    • b:块设备文件(例如硬盘、光驱等);
    • p:管道文件;
    • c:字符设备文件(例如屏幕等串口设备);
    • s:套接口文件。

    2. 文件后缀与文件类型

    之前我们提到,Linux 中不以文件的后缀名来区分文件类型,文件后缀属于文件名的一部分;但这并不代表我们不可以使用文件后缀来区分文件类型 —— 意思就是虽然在 Linux 眼中文件后缀没用,但是我们可以把文件后缀当作对用户的一个提示符号。

    同时,Linux 中不区分文件后缀,并不代表 Linux 下的各种工具(比如 gcc、g++)不区分文件后缀。

    三、文件权限值的表示方法

    3.1 字符表示法

    在这里插入图片描述

    3.2 八进制数值表示法

    每种权限用一个二进制位表示,有权限为 1,无权限为 0:

    r w x
    1 1 1 (二进制)= 7(八进制)

    其中 r = 4、w = 2、x = 1,三位相加即可得到对应八进制数字。

    在这里插入图片描述

    四、设置文件权限

    4.1 chmod 指令

    使用 chmod 指令可以完成对指定身份(拥有者 u、所属组 g、其他人 o)的权限(读 r、写 w、执行 x)的修改。

    chmod [参数] 权限 文件名

    注意:只有文件的拥有者和 root 才可以改变文件的权限。

    1. chmod 指令权限值的格式:用户表示符 +/- 权限字符

    用户符号:

    • u:拥有者;
    • g:拥有者同组用户;
    • o:其他用户;
    • a:所有用户。

    +/- 的意义:

    • +:向权限范围增加权限代号所表示的权限;
    • -:向权限范围取消权限代号所表示的权限。

    为了演示方便,提前把权限全都置零了。

    • 用户:

    在这里插入图片描述

    在这里插入图片描述

    • 组:

    在这里插入图片描述

    • 其他用户:

    在这里插入图片描述

    • 所有人:

    在这里插入图片描述

    2. 三位八进制数字

    文件的权限一共三种 —— 读写执行,所以用三个二进制位就可以表示全部情况,如果用八进制则只需要一位:

    r w x
    1 1 1 (二进制)= 7(八进制)

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    4.2 chown 指令

    修改文件的拥有者。

    chown [参数] 用户名 文件名

    注意:当我们使用 chown 指令将属于我们的文件赋给别人时,需要获得别人的同意,所以在一般情况下我们是不能改变文件的拥有者的;只有 root 不受权限的约束,可以直接将属于 A 的文件赋给 B,而不需要征得 A 和 B 的同意。

    在这里插入图片描述

    在这里插入图片描述

    4.3 chgrp 指令

    修改文件或目录的所属组。

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

    注意:和修改文件的拥有者一样,我们也不能直接修改文件的所属组,需要征得别人的同意,而 root 不受权限约束。

    在这里插入图片描述

    4.4 umask 指令

    Linux 下文件的默认权限如下:普通文件的默认权限是 0666(读写),目录文件的默认权限是 0777(读写执行)。其中第一位数字代表这是三位八进制数,后面三位数字分别代表拥有者、所属组和其他人对文件的权限。但是我们发现,平时创建的文件的权限和上面的好像并不相同:

    在这里插入图片描述

    这是因为创建文件或目录的时候,除了受默认权限的约束之外,还要受到 umask(文件掩码)的影响。假设默认权限是 mask,则实际创建出来的文件权限是:

    实际权限 = mask & ~umask

    权限掩码的作用是:将在其中出现的权限在起始权限中全部去掉。因为一个权限在 umask 中为 1,那么其按位取反后再与默认权限按位与,得到的结果一定为 0;如果 umask 中为 0,则其按位取反后与默认权限按位与后,不影响默认权限的值。

    查看或修改文件掩码:

    umask 权限值

    注意:将现有的存取权限减去权限掩码后,即可产生建立文件时的预设权限;超级用户默认掩码值为 0022,普通用户默认为 0002。

    在这里插入图片描述

    修改文件掩码:可以看到,当我们把文件掩码设置为 000 后,此时创建出的文件的最终权限就等于文件的默认权限。

    在这里插入图片描述

    4.5 file 指令

    辨识文件类型。

    file [参数] 文件名

  • -c:详细显示指令执行过程,便于排错或分析程序执行的情形;
  • -z:尝试去解读压缩文件的内容。
  • 在这里插入图片描述

    五、目录的权限

    目录权限所代表的含义如下:

    • 可执行权限:能否进入目录 —— 如果目录没有可执行权限,则无法 cd 到目录中。

    在这里插入图片描述

    • 可读权限:能否查看目录中的文件内容 —— 如果目录没有可读权限,则无法用 ls 等命令查看目录中的文件内容。

    在这里插入图片描述

    • 可写权限:能否在目录中创建与删除文件 —— 如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件。

    在这里插入图片描述

    所以如果我们要进入一个目录,就必须有可执行权限;这也就是为什么普通文件的默认权限是 666,而目录文件的默认权限是 777 的原因。

    六、粘滞位

    在一个 Linux 系统中通常有很多用户,那么有时就会有这样一种需求:不同的用户需要在一个公共的目录下进行临时文件的增删查改。这个公共目录通常由 root 用户创建,然后将目录权限修改为 777:

    在这里插入图片描述

    但是这里出现了一个问题:由于这个公共目录的权限是 777,所以任何一个用户都可以删除此目录下的文件,无论该文件是否属于自己,如下:

    在这里插入图片描述

    可以看到,对于 test 来说,ljm.txt 这个文件是不可读、不可写且不可执行的,test 也确实不能对它进行这些操作;但是 test 却能够直接删除 ljm.txt,因为 ljm.txt 处于 tmp 这个目录之下,而这个目录对于 test 是可读、可写、可执行的。

    为了解决上面这种不科学的情况,Linux 引入了粘滞位的概念。

    粘滞位是权限的一种特殊情况:它不影响不同用户在公共目录下的读写执行操作,但是它可以禁止不同用户之间互删文件。粘滞位设置的方式很简单,只需要在目录已有权限基础上加上 t 即可,并且添加时不用指定用户,Linux 会自动识别:

    在这里插入图片描述

    注:当一个目录被设置为"粘滞位"以后,该目录下的文件只能由文件的所有者或者 root 删除,其余用户不能删除。

    赞(0)
    未经允许不得转载:171主机测评 » 【Linux】权限的详细讲解
    分享到: 更多 (0)

    评论 抢沙发

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