Linux——初步认识Shell、深刻理解Linux权限
文章目录
- 文章引入
- 初步认识Shell
- 深入理解Linux下的权限
- 用户的切换
- 使用sudo进行短暂提权
- 权限的深入理解
- 权限的本质
- 权限的意义
- 如何控制权限
- Linux下的权限属性的分类
- Linux下对于角色的分类
- 文件的权限查询
- 权限的具体表现
- 普通文件的权限表现
- chmod指令、chown指令和chgrp指令
- chmod——修改角色对应权限
- chown指令和chgrp指令——修改角色
- 目录的权限表现
- 文件权限的八进制表示
- 缺省权限
- umask
- 不同用户之间的隔离
- 目录写权限和文件删除权限的矛盾
文章引入
在此前的三篇文章中已经介绍过Linux的一些基础指令和快捷键。这些基础的指令和操作已经足够我们作为入门Linux的基础知识了。
接下来我们将开始对Linux系统下的一些重要的知识点和内容进行讲解。本篇文章将对Shell(外壳)做一些初步地认识,然后将重点讲解在Linux系统下的权限。
初步认识Shell
首先,Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
这里先做一点简单解释,那就是如果能够直接和系统内核打交道,那是很危险的事情。可能但不限于会出现用户攻击系统内核、误操作导致系统出现一些不可控的问题。而且从使用角度上来看,直接使用内核的门槛很高,一般是不擅长使用这个内核的。所以Linux系统下,我们并没有直接使用系统的内核,而是通过命令行和系统进行交互的。
接下来我们再来看看命令行的相关内容:
这是从我的Linux机器的命令行,这个命令行是我们用来和内核进行交互的。
命令行大致可以分为这三个部分:用户名 主机名 当前所处的工作路径
这里我登陆的是超级用户root,目录~是用户登陆时默认在的路径——家目录。如果是root用户,家目录就是在/root这个目录下。
也就是说,我们是通过命令行来和内核进行交互的,这个命令行其实就像是包裹在kernel上层的一层壳子,这层壳子把用户和内核隔离开来的:
用户想要让内核做一些事情,是需要通过命令行来输入一些指令的。
其中,Shell的作用就是:
1.接收用户输入的命令行进行翻译工作后交给内核处理
2.同时,将内核的处理结果翻译给使用者
这样做是非常有必要,且非常好的一种方式。首先,这样子方便了用户进行操作。因为前面说到了,一般的用户是很难直接操作内核的,而且这样做也是非常危险的。直接把内核暴露出来,很容易遭受到攻击的。如果内核外面套了一层Shell,那么Shell这个外壳程序就可以先对用户输入的命令进行预处理,如果发现是出错等问题就可以自行处理,不会再交给内核,这样其实也是更好地保护了内核。
这里举一个简单的例子再来从感性的角度去理解Shell的作用:
就好比一个人要去相亲,但是自己又不擅长和异性打交道。那么就需要去找媒婆(中间层),让媒婆在两人之间进行斡旋。这个媒婆的作用就好比是Linux系统中的外壳程序。
但是这里要搞清楚外壳程序的另一个概念,这个名字Shell是外壳程序的总称,而不是说外壳程序就是叫Shell。比如我们的Linux系统下,外壳程序的名称是bash,bash是众多外壳程序的其中一种,就好比有个媒婆叫王婆,这个王婆的职业是媒婆。她只是众多媒婆的其中一个。bash之于Shell就如同王婆之于媒婆。
其实Windows系统也是又这么一层Shell的概念的,比如我们的图形化界面GUI。我们操作windows并不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来⼀个应用程序)。
总结一句就是:Shell是非常有必要的。它负责解析用户输入的指令传递给内核,并将内核的处理结果处理后给用户。不仅简化了用户操作,还保护了内核。
深入理解Linux下的权限
学习一款操作系统,权限总是一个避不开的话题。这个部分我们将来重点探讨一下Linux下的权限是如何进行划分的,不同权限之间干的事情又有怎么样的限制。
用户的切换
很早的时候我们就讲过,Linux系统下是分为两种用户的:
root(超级用户) 普通用户
这个部分为了能演示出两种不同用户的特性,需要自行添加1 ~ 2个普通用户。
注意:添加用户只能在root账号下添加,普通用户是没办法添加用户的。
这里需要使用指令:adduser 新普通用户名
这个时候还需要对这个普通用户进行设置账号密码,用到指令passwd 新普通用户名:
这个时候系统会弹出要你输入密码,并且需要二次确认(密码不会回显在终端显示器上)。
新添加的用户是会出现在根目录下的一个叫home的目录里面的:
这里我就建了两个新的用户。
然后如果想以后直接点解Xshell终端就可以直接登录建立的普通用户的账号,可以在Xshell进入界面处进行新建会话,然后进行配置。把新建的用户的公网ip和账号密码配置一下就可。
现在我们需要讨论的是,普通用户和超级用户之间的切换。
首先来看超级用户切换到普通用户:
使用指令su - /su 用户名
这两种方式有一些区别,我们来看一下:
我们发现,经过直接su 用户名,我们发现当前直接的用户名直接变成了ynp,说明完成了用户之间的切换。
但是su -指令也可以的话,那它和su有什么区别呢?
使用su 用户名:
使用su - 用户名:
经过两组指令的对照,我们会发现,如果使用的是su - 用户名来进行登录,会多一行信息:Last login: Mon Jun 2 19:42:13 CST 2025 on pts/1
这个其实就是重新登录了。然后我们再来看身份切换后身处的工作路径。
使用su 用户名后,工作路径和身份切换前保持不变,但使用su - 用户名,工作路径变了,自动变到了当前用户登陆时默认处在的家目录下。
接下来我们再来看普通用户切回超级用户,直接使用指令su - / su。
区别其实也是一样的,直接使用su指令,在输入密码后就可以切成root账户的身份,但是保持了工作路径不变。如果是使用su -,那么就会以root账户的身份重新登录,工作路径一定会在root账户的家目录下。
使用su:
这个时候是需要我们输入密码的。这里必然是输入超级用户的密码,但是注意密码不会回显。
使用su -的就不进行演示了,道理是一样的。
这里我们会发现,从root超级用户切换至普通用户,是不需要输入密码就可以实现身份的切换的。但是从普通用户的切换回超级用户,是需要输入超级用户的密码。
root账户其实就是超级管理员,权限是非常高的。基本可以无视一切(除了某些正在进行的程序无法忽视)。这里我们是使用的云服务器,我们本身就知道root账户的密码,所以我们当然可以随意的来回切换。但是在以后的开发场景中,超级用户的密码我们往往是不知道的。
但是普通用户在使用上是有一些不方便的:
比如切换到普通用户后,我们想使用指令ls来查看当前root目录下的文件情况都是不被允许的(Permission denied)。
再来看一个例子,我们现在写了一个c程序,就是简单地打印Hello World!,我们之前讲过,所谓的指令其实就是可执行文件复制到了/user/bin目录下。我们这里想要直接把HelloWorld当作一个指令来用,就需要将这个文件复制过去。
但是我们发现,还是给出了(Permission denied)的提示,即请求被拒绝了。说明普通用户就连基本的安装"程序"的功能都没办法做到。
这个时候就可以使用su -/su指令进行提权了:
我们可以切换到root账户完成这件事情。所以用户身份的切换还是有必要的。
使用sudo进行短暂提权
当然,上面的方式进行提权还是有一些问题的。问题在于:不是所有用户都知道root的密码。
如果每一次想做一些操作,就比如最大的需求——安装软件都要转换成root用户提权才能安装软件是很麻烦的。而且并不是每个人都会知道root账户的密码。那这个时候应该怎么办呢?
这个时候需要使用一个叫sudo的指令:
我们如果是普通用户,工作路径是root目录下,是无权查看目录中的任何内容的,读写都不行。但是这个时候我们在指令的前面加一个sudo,这个时候系统就会弹出要我们输入密码的界面,输入的是当前普通用户的密码。
当输入密码正确后,正常来说,就普通用户就大概有10 ~ 15分钟的时间被短暂提权了,这10 ~ 15分钟内再使用sudo + 指令就不需要再输入密码了。这期间内,普通用户就可以使用sudo进行提权,就可以访问或者读写那些被root管控的目录和文件了。
这里的sudo可以短暂提权是类似于白名单的一个原理:
通常由黑名单和白名单这么一说,黑名单就是不信任该名单内的所有用户。白名单就是相反。
如果账户处在系统内置的"白名单"内,那么系统就会信任这个用户。当使用sudo指令的时候,就会给这个用户短暂地提权。
但是使用sudo进行短暂提权,竟然只是输入普通用户的密码就可以,不需要输入root用户的密码,这合理吗?
其实这也是比较合理的,我们来看看一个问题:
这里是我使用sudo ls后,输入了普通用户的密码,发现报错了:
ynp is not in the sudoers file. This incident will be reported.
这个报错的意思就是,该用户不在sudoers file,也就是我们上面说的一个类似于白名单的东西。这个sudoers file存储在路径:/etc/sudoers
当前我确实是没有把这个普通用户给添加进去的。修改这个配置性文件是需要使用文本编辑器vim的,但是当前我们并没有学习vim如何使用,这个文本编辑器的使用是比较困难的。我们后序会专门有一篇文章来讲它的使用和相关配置。
这个/etc/sudoers
文件是只有超级用户才能查看和修改的:
如果使用普通用户进行查看是不被允许的。
也就是说,对于sudo的短暂提权,必然是要被提权的用户处在这个白名单里面,本身就是信任的。而且还是需要输入密码进行确认身份的,这本质也就是防止误操作的一种方法。所以能够提权是需要经过两步的。这大大地降低了误操作的改概率。但是又必须适当的给予普通用户一些权限,要不然系统使用起来还是很不方便的。
再次提醒:
由于当前vim的使用比较困难。就先不对sudoers file进行修改了。现在很容易会把里面的一些东西搞错。所以先不管。当前遇到所有的需要提权的场景,我们先统一切换root提权。
权限的深入理解
接下来这个部分,我们将真正地进入到权限的深入理解。
权限的本质
我们常说权限,何为权限?
权限其实就是能干的和不能干的事。
就好比法律限制了我们能做的事情和不能做的事情,当然不同角色拥有的权限也是不同的。比如警察、律师、法官等…
权限本身束缚的不是人,而是角色。权限是针对于角色而言的。而我们每一个人都只是某个角色的其中一个,自然对应了该有的权限。这里对找到Linux操作系统下也是一样的,权限并不是针对于某个用户而言,而是用户所扮演的角色而言的。至于用户扮演了什么角色,这个我们在后面控制权限部分会详细讲解。
权限的意义
首先我们得明白权限的意义:
控制了每个角色的权限,一定程度上减少了错误的发生
这一点就类似于分工合作。每个角色都有对应的权限,这样子可以大大减少错误。
而且还要明白一点:权限 = 角色 + 目标的属性
这是什么意思呢?
首先,权限是针对与角色而言的,不同的角色有不同的权限,可以做不同的事情。
其次,有些事情就算有权限也做不了,因为目标不具备有这个属性,如:
当前root用户有权利执行在root账户下的可执行程序,但是有一个文件是.txt的文本文件,即使root有权利执行这些可执行文件,但是由于文本文件不具有被执行的属性,所以也从这个角度上来看,也是没有执行的权限的。
所以,权限不仅仅是针对角色(人)而言的,也有可能是针对于目标的属性。
如何控制权限
这个部分我们来学习如何控制Linux系统下的各类权限。
Linux下的权限属性的分类
我们之前就讲到过,在Linux下,一切皆文件。这个就不再多说了。
在这个前提下,我们操作Linux系统的本质,其实就是操作一系列的文件。那么文件的属性有哪些呢?大概也就是:读、写、执行这三种权限了。
在Linux下用三个字母代表这三个权限:读( r ),写( w ),执行( x )。
其实就是,Linux的权限大概就分为这三个类型,我们控制权限,本质就是控制各个文件/目录的读写和执行属性是否能给某个角色(某个用户对应的)使用。
Linux下对于角色的分类
说完了权限的分类,权限又是针对于角色而言的。那么用户代表的角色就很重要了。
在Linux下,用户的角色被分为这三类:拥有者、所属组、other(其他)。
这个其实是可以在文件属性中可以看见的:
在我们使用指令ls -l / ll展示出的文件详细属性的时候,有两行带用户名的。
第一行代表的是文件的拥有者(其实就是创建这个文件的用户),第二列代表的是所属组(如果没有进行设置默认拥有者和所属组是同一个)。
这里并没有展示出最后一个角色other,其实也不需要。因为如果一个用户的角色不是拥有者,也不是所属组,那就是other。那other的用户必然是很多的,一个一个记录还是太难了,所以干脆就全部认为是other,不用写在上面其实也可以分辨出来的。
这里还需提及一下:
正常来说,只区分拥有者和other就可以了,为什么还要加入一个这么奇怪的所属组的概念呢?
我们假设这么个场景:
在公司开发过程中,可能组长是需要查看我们的代码的,但是如果只是区分了拥有者和other,那么必然是要我们把我们写的代码公开给other的,这样子组长就可以看得到。但问题是,组长此时是属于other的角色,其他人也是啊。但是其他人其实是不想让他们看到的。所以这个时候只有两种角色分类是不够的。
所以Linux针对于这种情况,多加入了一个叫做所属组的角色,即可以把劝降放开给所属组里的用户(人),而对于other还是保持不开放。这样子,组长想看的话,把组长加入到所属组就可以了。又或是和同组同事合作的时候,要互相查阅的话,也是可以把同组的人拉进一个组。
所以这就是为什么Linux下角色的分类是有这么三种。
然后在这里先说一个结论,文件/目录的权限其实是可以查看到的,就是使用指令ll / ls -l就可以查询到:
即使用这两个指令显示出来的详细的文件信息的前面那一串字符表示的就是当前文件对应的权限。但是这里要注意,不包含第一个字符。
我们早已经渗透过,这样显现出来的文件信息的第一个字符代表的是Linux系统下文件的类别。
文件的权限查询
接下来我们一起来看一下文件对应的权限。这里需要再次回顾:
对于文件有三种权限:读、写、执行,它们在Linux中的代号分别是:r w x,这是一定要记住的。
然后,当我们使用指令ll / ls -l的时候,第一列的字符串(除了第一个标识的是文件类别),其余的都是文件的权限。
我们这里也是先给出结论:我们发现,使用指令ll / ls -l展示出来的文件信息,第一列的字符串除了开头之外正好是九个字符。其实这里的九个字符是对应的三种角色的权限。
即从头开始,每三个字符为一组,分别对应的是拥有者、从属组、other的对应的权限。且顺序一定是按照读 写 访问的顺序的:
这张图就可以很好地诠释了Linux下文件的权限是如何进行查询和分类的。
我们可以举两个例子来看看:
1.比如Hello.c文件,它的权限就是rw- r-- r-- ,代表着拥有者可以读写文件,不能执行文件。所属组和other只有读文件的权限。
2.再看目录pos1,权限是rwx r-x r-x,代表着拥有者具有读写和执行这个目录的权力,但是所属组和other只有读和执行这个目录的权力。
当然这里一时半会儿也将不太清楚目录和普通文件对应的权限究竟怎么一回事。这是下个部分的重点,这个部分重点能够直到权限是如何查询和分类的就可以了。
权限的具体表现
上面我们展示的都是root账户下开辟的文件,这里渗透一点:root账户基本是无视一切。我们这个部分就先来验证一下文件对应权限的具体表现是怎么样的。为了能更好地演示,我们需要切换到普通账户去操作。
接下来,我们将会在当前这个普通用户下对这些存在的文件进行一些操作,来体会Linux文件对应的权限都是什么意思。
普通文件的权限表现
我们可以先简单地看一下权限的表现:
当我们以普通用户身份访问root.txt这个文件的时候,我们针对于这个文件来说,ynp这个普通用户角色是other。经过权限查询,发现只有读的权限。所以我们这里尝试把文件内容打印是成功的(只不过是空文件),但是我们想写点东西进去就不行了,因为没有写的权限。
对于这个普通的.txt文件,无论有没有执行权限都所谓,因为这个本身就不是可执行的二进制文件,连执行的属性都没有,何来的权限一说。
但我们现在尝试着切换到root用户看看:
我们这里发现,切换到root用户后,对于test.c来说,root用户是other,正常来说是没有写东西进去的权限的。但是这里root用户基本是可以无视一切的,所以即使other没有写的权限,但是root账户不管,它一定会有。
当然,这里的root账户也没有执行test.c文件的权限,因为test.c本身就不是可执行文件。
到这里我们其实就大概总结了:
对于普通文件来说,读权限就是查看文件的内容权限,写权限就是往文件里写东西的权限,执行权限就是能够执行这个文件的权限(需要文件是可执行文件才有这个权限)。
对于目录的权限,当前是不太好演示的,需要我们讲完下面的一些指令后,我们再回过头来进行一个总结。
chmod指令、chown指令和chgrp指令
这里我们要指出的一个问题是:对于Linux系统下的一个文件来说,不同角色的权限是否可以控制呢?又或者说,是否可以更换文件的拥有者或者从属组呢?
答案是当然可以的,要不然这个操作系统就给写死了,这是非常不灵活的。接下来我们将一起来看看以下三个指令,这三个指令可以解决上面的问题。
chmod——修改角色对应权限
我们先来回答第一个问题:使用指令chmod可以修改角色对应的权限。
chmod其实就是change mode的缩写,意思就是修改权限。
语法:chmod [参数选项] (用户代号 用户操作 (权限代号)) 文件名
常用参数:R -> 递归修改目录文件的权限
Tips:只有文件的拥有者和root用户才可以修改文件的对应的权限!!!
其实是很好理解的,因为root用户权限最高,无可阻挡。另一种情况是,如果一个用户创建的文件能够随意的被别人修改权限,那么就很危险了。
这里要指出:
用户代号
u 拥有者
g 从属组
o 其他所有的用户
a 全部的用户
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
看上面的语法感觉是很复杂,但其实用起来是比较简单且好记忆的。
我们来看看以下这个例子:
使用起来是很简单的。其实就是chmod + 需要给定角色修改的权限。
权限可以是修改一个,也可以是修改多个。
如果权限本身就有,那么再添加系统也是不会处理的添加的。反之文件本身没有的权限,即使表明要删除这个权限也是没有删除效果的,这点我们是不需要担心的。
我们这里需要指出一个问题,我们现在把test.c的拥有者的所有权限都删了,那么当前ynp这个用户为什么没办法访问到test.c文件呢?也不能写。这个用户对于test.c来说不即是拥有者,又是从属组吗?
这里要提出的是:当前我这里使用的系统是Centos7.x,在这个系统下,系统指挥识别一次用户对应的身份。而且是按拥有者、从属组、other这个顺序去确认的,一旦确认就不会在往后查看了,所以这也就是这里会出现这样的问题的原因。
chown指令和chgrp指令——修改角色
接下来我们来看看如何进行修改角色。
需要使用指令chown [参数] 用户 文件名来修改文件的拥有者:
语法:chown [参数] 用户名 文件名
常用选项-R 递归修改文件或目录的拥有者
但是发现好像出了一些问题,我们把文件拥有者改了时候,发现这个操作是不被允许的。
其实这是因为Linux系统下默认是不允许把文件给别的用户的。这是非常合理的,因为接收用户也不知道发出用户给出来的到底是什么?如果是错误代码呢?又或是病毒呢?这是很危险的,所以Linux系统下默认是不允许随便地把文件给其他用户的。
如果想要给其他用户,必须要高权限才可以。也就是需要提权:
1.直接切换root账户
2.使用sudo短暂提权
在这里由于没有修改白名单的配置信息,所以还暂时展示不了sudo指令的使用,但是当前我们是知道自己账户的root账户的密码的,所以我们直接切换账户提权就可以了。等到学习了vim之后再来进行修改配置,到时候就可以使用sudo了。
此时我们就发现,可以很轻松的改变一个文件的拥有者了。
这个时候我们再来验证一下:只有文件的拥有者和root账户可以修改文件对应角色的权限:
当test.c这个文件的拥有者被修改为ynp2这个账户的时候,ynp这个曾经的拥有者就没办法修改权限了,此时ynp是test.c的从属组了。
当然,我们也可以使用chgrp [参数] 从属组名 文件来修改文件对应的所属组:
语法:chown [参数] 用户组 文件名
常用选项-R 递归修改文件或目录的从属组
这里也是一样的,也是需要高权限才能修改从属组,这里就不演示了。
我们直接提权看看修改结果:
如果想要同时修改拥有者和从属组,使用指令:
chown 新拥有者:新从属组 文件名
甚至可以只改一个,比如不改拥有者改从属组:
也可以只改拥有者,不改从属组
中间用一个:进行分割就好了。chgrp指令其实是很少用得到的。所以如果实在是记不住那就直接使用chown进行修改角色即可。
目录的权限表现
讲完了上面的修改角色和修改权限指令后,我们就可以来看一下目录的权限表现是什么样。
对于普通文件来说,读、写、执行这三种权限其实是很好理解的。但是对于目录是上面意思呢?目录的读、写、执行操作分别代表着什么呢?我们一起来看看。
接下来,我们只演示对于目录的权限,所以我将使用另外一个普通账号进行操作。
在普通用户下,把某个目录的所有的用户的读写权限都关了,我们发现还是可以随意进出一个目录的,这就说明了,目录的进入和退出与目录的读写权限无关!
我们试着把读写权限给回来,执行权限关掉:
我们发现,一旦把执行权限关了后,不仅这个目录被高亮提示了,还发现进不去目录了。也就是说,目录的执行权限本质就是——能否进入目录。
但是超级用户还是牛逼,无视一切,拥有最高的权限。这个时候,我们也就搞明白了什么是目录的执行权限了。
现在我们再来看看读写权限是什么:
我们这里把读权限全关了,由于有执行权限,所以可以进入目录。但是,我们会发现,进入到目录后,无法使用ls指令查看内部有什么文件,但是却可以添加文件。
其实在这里也看的出来什么是目录的读写权限了:
读权限其实就是一个目录能否查看内部文件的权限,写权限就是能否向目录添加文件的权限。
其实很好理解,普通文件的读写就是查看内容和写进去内容,但是对于目录来讲,目录文件的内容其实就是里面的文件,所以读目录就是查看目录文件,写目录就是添加文件。
对于一个目录来讲,特别是对于拥有者来说,要想正常地操作一个目录,必然是需要rwx三个权限都有。故我们可以看到pos2那个文件,自生成开始,权限基本都是rwx,除了other用户。
文件权限的八进制表示
这里在给出一种表示Linux下文件权限的方式,即八进制表示法:
我们再倒回来看这张图,我们发现一个很有意思的事情,即权限的占位符是两态性的。对于每个位置,如果是权限位就写对应权限代号,否则就是-。
这就很像计算机里存储的比特位一样,通电位1,反之为0。
其实这里也是可以的,有权限那一位代表1,否则是0。只不过说不同区域的占位符表示的是不同角色对应的权限罢了。
假设现在有这么一个文件:
drwxrwxr-x 5 ynp2 ynp2 4096 Jun 3 21:33 pos1它的权限可以这么表示:
拥有者权限为 : rwx -> 111 -> 三进制的7
从属组权限为 : rwx -> 111 -> 三进制的7
other权限为 : r-x -> 101 -> 三进制的5所以也可以称pos1的权限为885
这也是可以这么用的,比如我们现在想要让pos1的权限变成:rwxr--r-x -> 7 4 5
:
当然这样子使用的话就没有那么好理解权限位的原理了。但是有时候想要让权限全打开或者全关闭还是会很方便的:
这里我们稍微解释一下为什么是三进制位:
因为3个比特位从000 到 111之间,有8种可能性。正好代表十进制的0 ~ 7数字,这不就是八进制位。这个原理就跟为什么四个比特位可以表示成一个十六进制位是一样的。
缺省权限
我们在c++种学过缺省参数的概念,缺省的本质其实就是默认值。这里的缺省权限其实就是,在我们不进行任何操作的前提下,系统生成文件时默认带的权限。
这里为了讲述方便,就使用八进制表示法来标识文件的权限了。
系统默认生成的权限位:
我们发现,系统展示的普通文件权限是664,目录文件是775权限。但这个是经过处理的。
其实系统默认的权限其实是:
普通文件 666 默认不带x
目录 777 默认携带x
但这里为什么显示出来的并不是这个真的默认值呢?反而是给出了系统展示的值。
umask
这里要提出一个新的概念——权限掩码。我们其实可以在系统中查看到的:
这里不需要管第一个位的数字,第一个位表示的是设备。
我们就重点看后三位,发现是002。
那么很多人一看就会说,是不是系统生成权限 = 默认权限 - umask?
那当然没那么简单,计算公式是:生成权限 = 默认权限 &(~umask),即默认权限和umask按位取反后的结果进行按位与操作。
我们来看看计算过程:
另外一个的计算过程就不展示了,原理是一样的。
权限掩码也是可以自行设置的,使用指令:umask (指定掩码),注意,这个掩码其实就是前面讲到的把进制位表示法,不要写错了。而且一旦退出登陆了,这个掩码会自动重置成系统的默认值。我这里是0002,不同的系统有所不同:
我们可以带设备名称(最前面的那个),但是不带也可以。但是如果第一个数字不是和系统内置的一样的就会报错了。
当然,这里还是要讲一下作用,掩码作用就是:
在掩码出现的权限,不能在系统生成的权限内出现。这个自行验证就好了。
所以这也就是为什么不能使用减法的原因,因为算法的需要达到上述的要求。
这里肯定会有人问这个有什么意义,其实意义还是挺大的。因为总是会有用户有各种各样的需求,所以Linux的开发者在写这个部分的时候可能就考虑到了这一点。因为直接写死也不太好,干脆就设计一种方法,能够让用户自行选择。
不同用户之间的隔离
当我们是一个普通用户1的时候,如果切换到另一个普通用户2的,2用户是没有办法查看和修改普通用户1账户内的内容的。这其实是Linux系统自动隔离了不同用户的:
我们前面讲过,Linux下都是文件。所以本质是两个用户,就是两个目录。登陆的时候各处在一个家目录下罢了。家目录的路径就是:/hone:
我们发现,用户的目录产生的时候,权限是700,也就是说,只有拥有者(用户本身)才可以进行一系列的操作,所以这就成功地将用户进行隔离了。这也就是为什么一台云服务器下能跑好几个Linux的用户的账户。
但是root用户权限最高,这里的这些权限是拦不住root用户的。
目录写权限和文件删除权限的矛盾
我们前面加讲那么多,貌似是忘了点什么,即文件的删除是什么权限呢?
我们现在把文件的权限全部关掉,发现依然是能够删除的,这也就说明了其实文件能否被删除和文件本身是没有关系的。
回忆一下前面讲到的目录的权限。我们说到,目录的读写权限,本质是查看目录内文件和修改目录内的文件。那么删除当然也算修改文件了,减少和增加文件都是修改。
所以这里能被删除的原因是因为,当前是在普通用户ynp2的家目录下,是拥有者,在这个目录下有rwx权限,所以可以修改目录内的内容,自然就可以删除文件了。
我们现在试着把写权限关了看看:
果然是这么一回事。
所以这里我们得到一个结论:文件的删除取决于所在目录的写权限是否打开。
但是这里感觉很奇怪,假设现在处于公司开发环境下,有一个公共文件夹。这个文件夹的权限对工作组(所属组)放开为rwx权限。(必须要,因为分工合作,需要把代码的推到公共文件夹,是需要读写执行权限的,要不然没法弄)。
但是这里会面临一个问题,就是我写的东西,如果我不想给别人看和修改,设置个权限没问题。但是这里有一个bug,即别人看不了,但是可以删。因为当前目录开放了w权限。但是不开放w权限,又不能在目录内部署代码的了。这就矛盾了。
针对于这种情况,Linux系统在权限位下加了一个粘滞位(t):
将文件最后一个权限位改成t,使用指令chmod +t 目录
这个时候就有意思了:
我写的东西别人就不可以乱删了。这个带有粘滞位的文件一般都是放在根目录下的,因为一般来说在公共合作的情况下才会用得到。要保证能够同时让所属组的访问得到,放在一个普通用户的目录下那肯定是不行的。
其实Linux系统下是自带这个文件的,即根目录下的tmp文件:
这就是带粘滞位的。我们来试着用一下看看:
我们使用两个普通用户在tmp这个带有粘滞位的目录下创建一些文件。我们发现,此时虽然有rwx权限,但是即使使用强制删除也是没有办法把别的用户创建的文件给删除的了。这就是粘滞位的作用。
但是root用户还是可以随意删,所以再次重申——root用户拥有最高权限!