Linux权限
shell命令以及运行原理
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
帮助理解:如果说你是一个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的MM小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。
Linux权限的概念
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以再linux系统下做任何事情,不受限制。
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令: su [用户名]
功能: 切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 suroot(root可以省略),此时系统会提示输入root用户的口令。(即root用户的密码)
- 演示:
上面切换之后最终的结果的路径不变,如果是lesson目录,切换之后仍然是lesson,只是用户变成了root。那么如果要像重新登录root的路径一样,直接切换到root的家目录的话,在su后面加上-
,即可。
演示:
既然普通用户能变成root用户,那么root用户也能切换到普通用户,直接su 用户名
就可以切换到你想切换的用户了,可见root的重要性。下面具体实操一下:
但是我们其中发现一个问题:
通过su从root用户切换到任意的子用户时,无法查看这个子用户的具体内容。但仔细观察我们发现,路径是有问题的,正常的一个用户的家目录应该是~
,而此时这个路径是root,因此我们访问不了, 当我们cd ~
到此用户的家目录中,就可以查看具体内容了:
Linux权限管理
在此之前,对于权限,主要有三个这样的问题:
- 什么是权限?
- 如何操作权限?(修改权限)
- 为什么要有权限?
接下来我们开始:
01.文件访问者的分类(人)
- 文件和文件目录的所有者:u—User(中国平民 法律问题)
- 文件和文件目录的所有者所在的组的用户:g—Group(团队)
- 其它用户:o—Others (外国人)
对于这些身份,将他们分类的意义在于能够将团队之间进行一定的联系,即一个团队都属于一个group,进而避免了Others的访问。
当我们通过ll命令显示文件信息的时候,会出现这样的示例:
即对应了上面所描述的具体信息,但我们发现,其第一个字符大都是不同的,因此文件类型也是不同的:
文件类型:
d:文件夹 -:普通文件(源代码、库文件、可执行程序、文档压缩包等等) l:链接文件(类似Windows的快捷方式) b:块设备文件(例如硬盘、光驱等) p:管道文件 c:字符设备文件(例如屏幕等串口设备,键盘) s:套接口文件
对于这些文件类型,和windows的命名方式并不相同,windows的文件类型在后缀中就可以进行观察和修改,但对于Linux文件,其命名并不能决定文件的属性,而是需要不同的指令来创建不同的文件,比如d开头的目录,就需要mkdir指令去创建,对于-开头的普通文件,就需要touch指令去创建,这些使我们已经学到的命令,对于其他文件来说,暂时不需要过多了解,只是提到并且知道有这么个东西即可在后续学习的过程中将会进行深入的讲解。
需要注意的是,对于后缀来说,Linux的文件属性虽然与其无关,但在其他命令比如gcc的命令下,对于后缀的要求和windows下是一样的,因为gcc只是Linux其中的一个工具,对应windows下的软件,是这个工具要求文件的后缀属性,因此在使用类似于gcc命令的时候将文件名命名成相应的后缀是必要的。
对于圈出的这10个字母,第一个的含义已经描述清楚,下面继续:
基本权限:
对于剩下的九个字符,我们三个三个分成一组,即:(依次为)
- rwx (拥有者)
- rwx (所属组)
- r-x(其他)
这三组就依次对应拥有者、所属组、Others的权限声明。
我们发现,每三个字符为一组后,存在着rwx-四种字母的组合,因此这四种字母也分别代表着不同的含义:
r:Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
w:Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
x:execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
“—”表示不具有该项权限
因此,我们可以看出,在这里file的权限是,拥有者具有读、写、执行;所属组具有读、写、执行;Other只有读、执行,并没有写的权限。
上面就解释了什么是权限以及权限的基本内容。
- 那么到了第二个问题,如何操作(修改)权限呢?
- 修改命令的权限
对于拥有者来说:
chmod u (+或者-) (具体权限)
(u代表拥有者),就可以改变拥有者对这个文件操作的权限,下面展示一下:(改变文件权限只能是拥有者或者root!)
通过±权限,我们可以看出拥有者的权限发生了变化,但对于执行权限来说,有的文件即便加上也不一定能够执行,因为这与文件的格式有关,一般是二进制文件才可以执行。
对于操作所属组和Others的权限来说,只需要将上面命令的u
改成g
或者o
即可,即:
- 改所属组 :g
- 改Others:o
这里继续补充,如果想要一起修改,举个例子,想要修改所属组和Others的权限,只需要在命令时用逗号隔开就能够同时进行修改:
chmod u-rwx,g-rwx test.txt
当然,我们也可以进行批量化修改,同时通过一条指令改变权限:
chmod a (±权限) 文件名
这样就可以同时修改。
那么,对于这些权限,到底与命令之间有什么关系呢?
可以看出,由于test.c不是二进制编码文件,因此对于拥有者来说,只能进行读和修改,不能运行test.c。
但当我们把拥有者读的权限去掉之后,cat test.c就读不到具体的内容:
可以看出,再进行cat读不到其内部的内容。这就是没有权限的表现。当然,这里仍有一个需要强调的地方,仍是这种把读的权限去掉之后,对于拥有者本身,不能读,但是事实上所属组仍然可以通过cat读出文件的具体内容,这时候就产生了一个歧义,拥有者本身既有拥有者的身份,也有所属组的身份,当把拥有者的身份’对应的权限去掉之后,是否拥有者本身还可以凭借着所属组的身份访问呢?
答案是否定的。在Linux中,为了防止这样的歧义发生,就设计了这样的一个规则:去掉拥有者的权限,即便仍有所属组的权限,只要在所属组中,你有着拥有者的身份,就不能去通过这个去掉的权限去执行。如果不这样设计的话,想要删掉拥有者的权限,就必须将所属组的权限也删除掉,这是不现实的。
补充: 通过ugo的方式,我们能够将其权限进行修改,此外,由于按照有1无0的原则,还有一中八进制的修改方式:
通过后面直接对数字的改变,我们同样可以改变权限:
即一个数字就代表一个身份的人具备的权限。777就代表这同时将拥有者、所属组、Others进行修改成所有命令都允许。
2.修改身份(修改拥有者、所属组、Others)
对于修改身份来说,作为文件的拥有者,我们可不可以将自己或者别人的身份进行修改呢?举个例子,能不能将作为拥有者的你修改成所属组或者Others呢?事实上,只有root有这个权限,即便你是拥有者,你也不能进行随意修改,当然也可以用sudo进行提权操作,在这里由于没有将本人账号添加到root白名单因此不能进行sudo的提权操作,因此我们直接用root账号进行演示,当学到vim时,将会详细介绍sudo的使用。
当我们进入root之后,cd /home ,再进行ll操作,就可以看见各个用户,再cd cfy,就可以用root权限对cfy的文件进行操作,因此在这里我们通过chown hwc test.c 就将cfy中test.c文件的拥有者从cfy变成了另一个·用户hwc,当我们把所属组的权限删掉之后,我们发现,cfy就不能通过任何形式访问,因为其既不是拥有者,也不在所属组中。
当然,我们想要将其切换回来仍可以用这个命令:
如果想改变所属组,将chown命令换成chgrp命令即可
同时改变cfy的文件的拥有者和所属组,将其变成hwc:chown hwc:hwc test.c
**总结:**对于修改Other其实是没有必要的,只要其不是拥有者不是所属组,那么就一定是Others,因此上述只介绍了两个1改变权限的命令,设置文件属性:chmod;设置文件所属角色:chown/chgrp
注意:
root永远不受权限的约束,既可以随意修改权限,也不会受到权限的约束,即便删除这个权限,root仍可以使用!
那么到了第三个问题,为什么要有权限呢?
通过上述的一系列的操作我们发现,权限的存在是便于我们系统进行安全管理的。
03.默认权限的初始值:
为什么我们创建的目录或者普通文件,默认权限是我们所看到的样子?
即:
Linux规定,目录的起始权限是从777起始的,普通文件起始权限是从666开始的,但对于这个来说,我们看下面的权限并不是这样:
[cfy@VM-8-3-centos ~]$ ll total 196 drwxrwxr-x 3 cfy cfy 4096 Sep 30 14:51 106 -rw-rw-r-- 1 cfy cfy 0 Sep 30 14:27 106.txt drwxrwxr-x 3 cfy cfy 4096 Oct 2 14:03 file -rw-rw-r-- 1 cfy cfy 0 Sep 30 14:27 file2.txt -rw-rw-r-- 1 cfy cfy 0 Sep 30 14:27 file3.txt -rw-rw-r-- 1 cfy cfy 0 Oct 1 21:18 file.txt -rwxrwxrwx 1 cfy cfy 94 Oct 5 20:20 test.c -rwxrwxrwx 1 cfy cfy 168948 Oct 5 20:17 test.txt -rw-rw-r-- 1 cfy cfy 16077 Oct 1 16:37 tmp.txt [cfy@VM-8-3-centos ~]$
我们发现,将其权限用八进制表示 106目录的权限是775,106.txt的权限是664。
实际上,这与Linux中的权限掩码有关:
04. umask
即通过umask命令得出:
[cfy@VM-8-3-centos ~]$ umask 0002
系统会默认配置好umask,当执行umask的时候,出现了四位数字,0002,但对于八进制权限来说,第一位的0我们并不算在内,那么权限掩码就是002,对于Linux文件中的权限,凡是在umask中出现的权限,都必须在起始权限中去掉:
对于八进制的002来说,转化成二进制就是000 000 010 ,因此,对于目录文件的默认777,将会变成775;普通文件的666,将会变成664,这也就与我们得到的默认权限是相符的。我们发现,这与减法类似,但事实上不是减法的运算,而是:
最终权限 = 起始权限 & (~umask) (~代表按位取反)
当然,umask的权限掩码可以自己设定,随之我们在新建文件的默认权限也会发生改变
超级用户默认掩码值为0022,普通用户默认为0002
05. 进入目录所需要的权限
- 1.r
当我们把r去掉后,发现可以进入,因此进入的权限与r无关,但当在目录中ll后,由于testq没有r权限,我们不能观察其内部文件。
- 2.w
- 去掉w之后,仍然可以进入,并且能够观察,但当我们创建文件时,由于没有w,因此不能创建。
- 3.x
因此我们发现,能够进入目录是因为有x权限,没有x权限就不能进入。
那么问题来了,换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限。 这好像不太科学啊, 我张三创建的一个文件, 凭什么被你李四可以删掉?
因此,为了避免这个不科学的操作,引入了粘滞位。、
粘滞位
Linux系统中有很多人,我们需要在一个公共的目录下,进行临时文件的操作(增删查改)
即我们通过ll /
就会发现有一个这样的目录,这就是公共目录,即每一个用户都可以在这里放入各种文件,也可以删除各种文件,因此为了避免张三的文件被李四的操作删掉,我们就需要利用粘滞位。
因此按照这种步骤,我们模仿上述的场景,从创建一个类似于上面的公共目录开始:
1. 创建公共目录
创建完公共目录之后,我们就可以以不同身份在其中创建文件了。
2. 以不同身份在mytmp公共目录中创建文件
接下来我们需要用另一个用户创建文件。
由于此账号暂时没有sudo权限,因此我们将其切换成root账号后直接su 另一个用户(hwc)
3. 以hwc的身份删除cfy所创建的文件
我们发现,cfy1.txt的权限不让hwc这个用户去写,于是hwc这个用户火大了,就把cfy1.txt这个文件给删除了,这也正是我们在引入粘滞位之前所说的情况。(操作如下)
即,一个不能以另一个用户读、写、执行的文件,竟然可以让另一个用户删除、,因此,创建和删除的权限是目录的权限,即在目录中创建和删除里面文件的权限不是文件本身的权限,而是目录的权限。
在这时候,我们就需要一个策略,让一个公共目录,大家可以进行rwx操作,但是禁止大家互删对方的文件,即去掉目录的这个权限,因此我们需要给这个公共目录设置粘滞位。
4. 给目录设置粘滞位
对于设置粘滞位,是以root身份设置的,对于root创建的公共目录来说,无论是cfy还是hwc都属于Others,因此我们设置的粘滞位是给Others设置的粘滞位。
当我们给目录设置完粘滞位之后,就需要验证一下是否还可以删除:
5. 验证是否还可以互删
- 对于root用户来说,无论怎样设置都可以删除,因此root的权限非常重要
总结:
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由:
一、超级管理员删除(root)
二、该目录的所有者删除
三、该文件的所有者删除
关于权限的总结
目录的可执行权限是表示你可否在目录下执行命令。
如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限
所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
关于Linux的权限部分到这里就结束了,觉得有用的话就三连支持一下作者吧!