前言

在我们初步了解了Linux的基础指令之后,我们就得开始学习在Linux下有什么事我们能够做到的,又有哪些事是我们没有办法做到的。这个就是我在本文重要给大家讲解的——权限。

另外在本文的讲解中会包含关于权限的一些指令,不过大家不用担心,我会结合具体的例子让大家把这些指令结合其应用场景给理解清楚的。好了,让我们开始本文的学吧!!!💖💖💖
哈哈哈

1. Linux下用户的分类

相信各位读者在学习Linux时,不是用的虚拟机就是云服务器。但是这两个有个共同的现象,那就是每次登录时都得输入密码。这个过程就是在验证你的身份,这种感觉在使用的云服务器的读者更加的明显。使用云服务器的读者在登陆之前甚至还要你输入登录的用户名,你还可以登录到root账户上。

我们平常登录的Linux系统的用户都叫做普通用户,在Linux中有个具有凌驾于一切规则之上的用户,root —— “超级用户

所以在Linux操作系统中,用户被分两类,一类是root,另一类则是普通用户。

普通用户和root有什么区别呢?
普通用户与root的区别:root基本不受权限的约束,普通用户是受到权限的约束的。

1.1 su 指令

那我们能否做到在我们的虚拟机或者云服务器上,实现用户之间的切换?
答案时肯定可以的,使用su指令。

用户
这个是我云服务器上面的用户名。接下来的演示,我就会以上面的用户作为例子,大家在阅读本文时,注意用户名的切换!

1.1.1 使用su指令切换到其它的用户上

用户的切换(我要切换到king这个用户中):
用户切换
注意这里的Password填的是切换目标用户的密码!!!(这个应该很好理解吧)

如果我们切换到别人的用户下,突然想回到自己的用户了,我们该怎做?

第一种方法:输入exit指令
第二种方法:按住键盘上的CRTL + D
退回到之前的用户

1.1.2 使用su指令切换到root上

上面的例子都是普通用户之间的切换,那普通用户与root用户之间怎么切换呢?

在命令行上输入su或者su -指令。

图片
这里的Password输入的是root的密码。

su -指令

1.1.3 su指令的总结

当我们想要切换到其它的普通用户下:
我们可以这样写:su [username] ([username]就是你想要切换的用户名)

当我们想要切换到root用户下:
我们可以写成 :su 或者 su -

回到主线:
所以通过su指令,我们也明白了一个道理:Linux中的所有用户,都需要密码,无论是root还是普通用户。即便是多个普通用户也是需要设置密码的。

这里我给大家在设置密码时一个小建议,一定要将root用户与普通用户的密码设置的不一样。

1.2 sudo指令(对某条指令进行提权)

在这里可能有的读者就在想,我切换到root下如果发生了误操作,把某个重要的文件给删除了,这样就麻烦了。而且如果我只是执行一条指令时需要用到root的权限,我也要切换到root用户下吗?有没有更加方便的方法?
这个时候sudo指令就闪亮登场了!

refuse
这里我用一个普通用户的身份进入其它用户的家目录下,这个权限是我们作为普通用户是没有的。这个道理也很好理解的,假设其他用户是一个你互不相识的人的,你想进行别人的家中,别人肯定是不允许的。如果你真的进去了,那不相当于私闯民宅了!

但是如果你此时拿着警察给的搜查令的话,那你就可以进入到别人家里面了。

语法
分析:这里你用sudo指令对cd king赋予了root权限。此时的你,就像是拿着搜查令,大摇大摆的进入别人的家中了。

1.2.1 sudo指令的语法

sudo指令的语法:sudo [command](command就是你想要提权的那条指令)
作用:对单条指令提升权限

1.2.2 由sudo指令引发的思考问题

有的读者可能会这么想,如果普通用户对每条指令都用了sudo指令,代价就是输入自己的密码。那这样岂不是人人都是root用户了吗?

理论上是这样的。但是在Linux中还会对普通用户做一个界定。目前我们用adduser创建的用户,是没有颁发执行sudo权限的,换句话说,系统不信任你。除非未来将普通用户,添加到系统的信任白名单里面,这样普通用户就能使用sudo指令了。而这个白名单是在/etc/sudoers目录下,当然不同的系统会有差异!

这里展示一个使用sudo指令失败的例子:
失败

2. 什么叫做权限

什么叫做权限?这是个发自灵魂深处的拷问。

结合我们现实生活的感悟,权限就是一件事是否允许你去做

比如:你现在是一名腾讯视频的普通用户。你想看一部vip的电影,很遗憾你看不了。因为这个vip电影是只有vip用户才能看的,你身为普通用户是没有这个权限的。
再举个例子:你现在是一个学生,这一天你闲来无事,你先去校长办公室去看看校长是否在打王者荣耀。对不起,你肯定是连门都进不去的,因为你不是校长,你没有校长这个权限!

有一天我有一个奇怪的想法:我要把写完笔记的书给吃掉,我要在王者峡谷里自习!
这显然是不可能。因为这不满足事物的"属性",笔记的"属性"就是读、写,游戏的"属性"就是娱乐。如果我们做出了不满足事物属性的事,这个行为肯定也是不被允许的!

为此我们就可以对权限的特点做出两点总结:

  1. 权限认证的身份(权限与"人"有关)
  2. 权限也和事物的"属性"有关

想必大家听到这里,已经对权限有了初步的了解了。那么在Linux操作系统下,权限又体现在那些地方呢?
本文会以文件权限,带着大家深入了解"权限"这个概念。顺便解决大家在前期学习Linux时遇到的一些不懂得问题。

2.2 文件权限

文件
可以看到的是,在我们用指令查看但其那目录下所有文件的具体信息(文件名 + 文件属性)时,会出来一大堆的信息,这些信息代表什么含义呢?接下来,我就跟大家仔细地聊一聊。

我们可以把那一大堆信息,分为以下几部分:
文件具体信息

2.2.1 文件类型

首先,我们先来看红色框框出来的那部分。这个就表示文件的类型。

符号文件类型
-普通文件(可以是文本、可执行程序、库文件等等都属于普通文件,这一点跟Windows系统有很大的区别)
d目录文件
b块设备文件(磁盘文件、光驱文件等)
c字符设备文件 (键盘、显示器等)
p管道文件 (用于通信)
l软链接文件

这里需要给大家指明一个细节:Linux系统中文件名后缀没有直接意义。(当然这并不代表文件名后缀没用)

在Linux系统中,其有这一套认识文件类型的体系,而依靠文件名后缀来确定文件类型,这种方法不在此体系中。换句话说,即使你目录名为dir1.c,在Linux眼中它仍然是一个目录。但是我们又要问自己一个问题,文件名后缀真的没用吗?
文件名后缀肯定是有用的。大家可以用gcc来编译一个test.txt的文件,它是会报错的!

从这个现象中,我们就可以感知到:虽然后缀名对于Linux来说没有什么直接的意义,但是这并不代表基于Linux系统上的各种软件来说是没用的!gcc就是一个典型的例子!

所以,在Linux中如何看待文件名后缀,取决于用户。

2.2.2 文件权限的解读

再来看一下,绿色框框出来的那一部分。大家会发现有一个共同的地方,这里来来回回只出现了四种字符"r、w、x、-"。
那这些字符分别代表什么含义呢?这就关系到我们对于文件权限的解读了。

讲解之前,先插播一点知识。在学习C语言的文件操作中,想必大家一定用过fopen函数,里面有一个参数就是让你设置打开文件方式,其中就有"w"和"r",就是"写"和"读"。没错!Linux下也是如此。

字符对应的文件权限
r可读
w可写
x可执行
-对应的权限位置,没有权限

到这里我们就明白了,之前看不懂得那一串字符是什么意思了。

我们说过权限的特征是,权限与事物的"属性"有关。那文件作为一种事物,其属性就是"读、写、可执行"。那由其属性诞生了对文件管理的角色,这些角色因为对文件具有不同的属性集合,为此就规定了该角色只能对文件做规定范围的事。这些角色有三种,分别称为"拥有者、所属组、其他人"。

文件具体信息
再仔细回看这个绿色方框里面的内容,你会发现这里面有9个字符。而我们又有三种角色,以3个字符为一组,代表一种角色的属性集合。

角色分类
从左往右依次是拥有者、所属组、其他人。我们再来看,蓝色框和黄色框的内容时,就十分清楚了。蓝色框的内容代表文件的拥有者,黄色框的内容代表文件的所属组

到这里,文件权限的解读就结束了。此时我们就想,有没有办法修改文件的权限,我们继续往后看!
哈哈

3. 修改权限

这里还是以文件权限为例。

文件具体信息
我们先将上面的拥有者的权限修改为可读、可写、可执行,所属组也是一样,该怎么修改?

用chmod指令!

3.1 chmod指令

语法:chomod [修改参数] 待修改的文件名。

修改参数:

  • u:代表拥有者
  • g:代表所属组
  • o:代表其他人

作用:修改对应文件的权限。

注意:使用这个指令的前提是,你必须得拥有root权限!

演示
大家可以仔细对比,权限改变的前后。

在这里你会发现,我们其实可以用二进制来表示对应位置是否拥有权限!

比如:
rwx,对应的二进制就是111;
r–,对应的二进制就是100.

而刚好1个八进制位就能够表示3个二进制位。为此我们可以将上面的指令简化为:
这样写
这样写的话,指令就会变得更加的简洁。

当然我们会遇到一种比较特殊的情况,那个就是如果我同时身为一个文件的拥有者和共享组,但是这两个角色所匹配的权利不一样,我听谁的?
比如
现在这种情况,就是作为文件的拥有者只有写和可执行文件的属性,而作为所属组而言,可读、可写、可执行。

哈哈

从结果就能看出,采取了拥有者的权限!这里我们就可以证实一个事实,在进行角色认证的时候,只能选择一个角色进行认证,而这个角色采取优先匹配的原则

回到主线,在仔细讲解了文件权限时,想必大家找到了规律,每一组字符的规定的位置好像表达的意思是一样的。没错,这就是我要给大家总结的规律。

  1. 位置是什么含义是确定的。
  2. 每一个位置只有是或者否,具有指定的权限。

4. 权限三个直击灵魂的问题

现象
问题1:为什么我们刚开始创建文件的默认权限是我们现在所看到的样子?(不同的系统可能有所差异)

这个问题可以分为两个子问题:

  1. 为什么普通文件的权限为664?
  2. 为什么目录文件的权限为775?

这里我就不跟大家卖官子了,其实我们的Linux操作系统默认是有给每种不同文件一个起始权限的,其中:

  • 默认给普通文件的起始权限其实是666
  • 默认给目录文件的起始权限其实是777

那究竟是什么沧桑巨变,让普通文件和目录文件变成了这副模样?
这个就是权限掩码的作用!

我们可以通过一个指令来感知权限的存在,这个指令就是umask指令。其作用就是查看你当前系统的权限掩码为多少。

权限掩码

从这里我们可以看出,权限掩码为002,注意这里它表示的是八进制!换成二进制也就是000 000 010.

所以结合权限掩码和通过某种特定的算法,就能够得到开始创建文件的默认权限了。
这个特定的算法就是:最终权限 = 起始权限 & (~umask)
碍于篇幅原因,这里我就不给大家演示了。

问题2:目录权限又怎么理解?

哈哈哈

字符对应位置的权限
r是否允许我们查看目录下文件的内容
w是否在当前目录下对文件进行创建、更改、删除
x是否允许用户进入对应的目录

这里我们就又可以验证一个现象了,那就是:
普通用户用户的家目录的权限是700,也就代表了我在我的家目录下创建文件,别人是看不到的。

问题3:共享目录?

在这个社会中,单打独斗显然是行不通的。我们必须得合作,在编程的世界也是如此,一个大的项目光靠自己一定是没有办法按照规定的时间内交付的。为此,我们需要数据的共享。

在这里插入图片描述

在这里,我创建了一个shared的共享目录,我们有两个普通用户共享这个目录,他们分别是sunyufeng和king。

有一天sunyufeng创建了一个文件test.txt的文件,并且往这个文件里写了一点内容:
例子
可以看到test.txt文件对其他人是有读权限的。此时,king用户出于好奇先看看test.txt里面的内容:
例子
没问题,king用户能够查看这个文件里面的内容。但是有一天,我又不想把这个文件给king用户看了,于是我修改了我文件的权限:
haha
等到过了几天后,king用户想再看看sunyufeng这个用户创建的test.txt里面的内容,于是他就:
哈哈哈
完了,文件打不开了。说好的爱情呢!!!一气之下,king用户就把这个文件给删除了,在删除时,竟然你不给我看我就把你的文件都给删除完!

删除了
test.txt的文件真的被删除了!

从以上的例子我们得知道了一个事情,test.txt这个文件不是king用户创建的,但是他却拥有着删除这个文件的权限。这也让显然是不合理的。为此解决这个问题的工具从天而降 —— “粘滞位”。粘滞位我们用符号"t"来表示。

此时我们只要修改共享目录的权限即可:
修改
此时,我们再来复现刚才的场景,再来看看king能否删除sunyufeng这个用户创建的文件:
现象
发现操作不被允许了,没错,这个就是粘滞位的作用!!!

讲到这里,总结一下:

  1. 一个文件能否被删除,并不是由文件本身决定的,而是由文件所在的目录决定的。
  2. 如果我们去掉共享目录的w权限,两个用户就没有办法创建文件啦!那共享目录的共享体现再哪个地方。
  3. 粘滞位:给目录设置的,一般是共享目录,大家可以进行各自文件的增删查改,只允许文件的拥有者或者是人root能删除这个文件,其他人一概不允许,t是一种特殊的x权限。

好了,到这里本文的内容就全部讲解完毕了!!!

如果觉得本文还不错的话,麻烦给偶点个关注吧!
哈哈哈

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐