当前位置: 首页 > news >正文

Linux权限理解

1.shell命令以及运行原理

    下面来介绍一个话题,关于指令的运行原理,这里先简单理解就可以。当我们登上Linux后:

yxx这里称之为用户名,@VM-8-2-centos是主机名,~是当前目录,$是命令行提示符。

其中我们把上面的一整套机制统称为bash命令行,自己在后面输入指令的过程,本质其实就是输入字符串。指令的本质就是编译好的程序和脚本,它一定会在系统的特定路径下存放。下面要说的是bash命令和指令两者间是什么关系以及指令是怎么跑起来的,这里先说一个小故事然后再说概念:

这是一个温馨的小镇,镇子上住了个人叫张三,他很优秀,但已经到了找对象的年龄了,他的父母一直催促他找对象。但张三平时性格比较沉闷,不太好意思和女生直接说话,于是他找来镇子里的王婆来帮他说说媒。王婆找到张三后问他喜欢哪个女生,张三说喜欢隔壁街住的如花。王婆说离这么近你怎么不直接去找她说,张三说因为自己不善于说话,于是王婆就跑到如花家去把张三的想法告诉了如花。如花说张三虽然很优秀,但是自己不是很喜欢他,于是王婆知道结果后再去张三家把如花的话告诉了张三。这就是第一个小故事,那故事中张三为什么不直接找如花问呢?因为张三不善于打交道。我们所有的指令,最终都要在OS内部运行,但是把OS所有细节等暴露给用户,直接使用OS难度比较高,我们用户不能直接和OS打交道,所以我们要有图形化界面或命令行解释器(bash命令行),由它来做翻译。就如用户和OS之间需要加个中间人,用户对应的需求或指令交给命令行解释器,命令行解释器和OS打交道让OS执行,执行后的结果返回给命令行解释器,命令行解释器再给用户,对我们而言它对应的工作模式就是这样。刚才的故事中张三就可以理解为用户,如花可以理解为OS,王婆可以理解为命令行解释器。因此张三为啥张三不直接找如花呢?不是家离得很近?因为张三不善于打交道。同样的用户为啥不直接和OS打交道,因为用户不善于直接访问OS。所以系统设计时为张三添加了王婆的角色,由她把张三的需求准确无误的给如花让如花执行,执行思考后把结果给王婆,再由王婆返回来给张三结果。如commond not found等这些动作都相当于给用户翻译来的结果,所以就需要一个命令行解释器的存在,它的作用是将使用者的命令翻译给核心(kernel)处理,同时将核心的处理结果翻译给使用者。它存在的意义是:1.进行命令行解释。2.保护OS,对于用户的非法请求直接拦截。第二个意义怎么理解呢?下面再看一个小故事:张三知道如花不喜欢他后比较不甘心,于是又把王婆叫来让帮忙再去问问,王婆没有办法只好答应了。王婆快走到如花家时从窗户发现如花一家人和李四一家人在其乐融融吃饭,原来如花一直喜欢李四,于是王婆在没有进去说媒,如果进去等于在破坏别人的家庭,所以就直接回去告诉张三结果。所以王婆直接离开变相的对如花家庭起到了保护作用,如同命令行解释器保护操作系统。

    平时一直听到bash/sh,shell,那这些是什么东西呢?命令行解释器是个统称,它其实在Linux下就叫做命令行、bash、sh、shell,在windows中就是种图形化界面。如果shell可以称为媒婆,那bash就是张婆,sh是李婆。意思是shell是所有命令行的统称,所有符合命令行解释性质的都叫shell,而bash/sh等是不同种类的具体的解释器。bash命令行就相当于王婆长什么样子,所以命令行具体的样式就像每个人不同的样貌,命令行它其实是具体解释器的展现的样貌以命令行的方式呈现出来的。

我们平时说Linux说的是它宏观上的整体,其实以后具体来说的时候都把内核叫Linux。而一般用户不善于和内核打交道,所以给OS套个壳子,也就是打个外壳程序,外壳才和用户真正的打交道。所以用户不能直接用kernel,而是直接使用shell外壳,使用方式是采用命令行或图形化界面的方式访问。

2.Linux权限的概念

    下面来说Linux权限的概念,关于权限部分我们需要说如下几点:1.认识Linux下的用户分类。2.什么叫做权限。3.见一见没有权限会有什么现象。4.关于权限的修改问题。5.其他问题(三个子问题)。

    下面正式来谈第一个问题,Linux下用户的分类我们可在宏观上分为两类:第一类是root,也就是超级用户,root这个用户其实是管理员级别的用户身份,这种用户身份类似于在Windows中的管理员身份,比如点程序时有以管理员身份运行。第二类是普通用户,比如我们用adduser新建的用户。那用什么来划分root和普通用户呢?它们的差别是什么?主要因为root基本不受权限的约束,普通用户是受权限约束的。用户分类这里重点要谈的是这两个用户身份之间是如何切换的?

现在我是一个普通用户,对我们而言要用root第一种做法是在进行Xshell登陆时用root登陆,但我们现在是普通用户的情况下怎么变root呢?下面来看su指令(补充:Linux中所有的用户都要有密码,无论是root还是其他,即便是多个普通用户,每个用户也都要设置密码)

那现在su的时候Password这里输入谁的密码?一般su时,Password这没有提醒的话,如for xxx,那这里就输入root密码(所以建议root账号密码和普通账号密码不要一样,否则用久了都不知道自己输入的是哪个密码)。

此时就变成了root账号,pwd后发现,虽然我的身份变过来了,但我依旧还是处于上一个用户所处的目录下。

要退回普通用户输exit或ctrl+d,此时whoami发现退回来了。与此同时su -也可以切换成超级用户,也一样输入root密码:

此时多了Last login让root重新登陆,此时pwd发现路径发生变化了。所以su是一个身份变化,直接将我从一个普通用户变为root,但并不是以登陆的方式来变化的;su -是让root重新登陆,所以root登陆所处的路径就是/root。回退依然是ctrl+d或exit,这就是双方的互相切换。

现在su一下,变为root,现在问题是我是root,我想变成其他人可以吗?

ls/home可以看到已经有的用户,用su ydd,whoami发现此时我就是ydd了。

此时可以cd ~,ll,所以我就可以直接进入到ydd自己的工作目录下以ydd他的身份来做各种各样的工作,回退还是ctrl+d或exit。

现在变成我自己yxx,那我自己想变成ydd,就su ydd:

这里分别输入root和自己的密码都说认证失败,很明显这里要输入ydd的密码。也就是说我是一个普通用户yxx,现在想变成ydd,不能变,除非知道ydd的密码,但root下变不用密码。所以目前在账号的切换下发现:任何人想变成root或其他人必须知道目标用户的密码,但root变其他人不用密码直接切过去,这就是root在用户切换上不受权限约束的一种表现。现在如果我们想暂时的对一条命令进行提权,比如说之前安装软件要用yum,也说过不管是下在安装还是编好的代码去安装,一定要把对应的文件拷贝到系统的某些路径下,普通用户是不允许往系统目录下拷贝的,但同时也想把这事办了怎么办?所以需要给一条指令做提权。

如单纯输入whoami是以我yxx的身份去跑的,现在给指令前带sudo,sudo whoami,这就是对一条指令进行暂时提权,说白了就是执行sudo后面的指令时以root身份去跑,此时输入的是普通用户我yxx的密码。第一次执行sudo后密码认证通过,下次在一段时间内在sudo whoami时就不用再输入密码了,就以root身份来执行sudo后面的指令了。所以未来想执行高权限的操作时要么变为root身份,要么用sudo进行指令提权。此时有个疑问:sudo后面直接跟命令,输入自己密码就变成root了,那这里是不是感觉有点离谱?正常情况也应该输入root密码,要不然人人都可以是root了。这里的疑问很正确,如果我们是普通用户,可以发现是没办法sudo的,因为目前我们用adduser新建的用户,没有颁发执行sudo,系统不信任你,除非未来将普通用户,添加到系统的信任白名单里面,yxx不在/etc/sudoers里面。

    下面来谈Linux对应的权限的概念:在谈权限前先问一个小问题,生活中什么场景下有权限约束这样的概念呢?比如非vip用户登陆腾讯视频是没有权限看vip电影的,变成vip后就有权限看vip电影;再比如学校里面有些地方是不能去的,如校长办公室,因为没有这个权限。所以什么叫权限呢?大白话就是一件事情是否允许被你做就叫权限。下面问个问题:比如校长叫张三,校长能进办公室是因为他叫张三还是因为他是校长?因为他是校长,所以权限认证的是身份。这明确一个概念:我们每个人本身+身份人物才能被具体化,所以权限认证是在认证我们这个人和身份是否是稳和的,从这里可以感受到权限和“人”有关。其次再如我有个本子,因为是我的本子我可以在本子上进行涂改,但我不能做本子属性上天然不具备的事情,如当面包一样吃了它。这很明显我们要去的目标事物天然的属性没有提供我要做的事情的能力,因此我们想做一些事情,除了硬性规定,根据我们不同的身份来区分我们能或者不能做这个事情,还有一种情况是事物本身天然不具备这种能力,所以感受到权限也和事物的“属性”有关。所以对我们来说权限是分为两方面的:一方面一定和“人”有关,另一方面一定和目标属性有关。下面先谈和事物属性有关,这主要说文件权限,以此处为切入点来谈文件属性,所以注定文件对应的属性中一定会对应它所包含的权限方面的东西。下面来说文件的属性,对于文件我们都知道一个文件被创建出来它的权限无外乎就是是否可读、可写、可执行。一个文件能够被读或写,这就是它的基本属性,因为一个事物权限也是要受这个事物本身属性影响的,所以文件中必然会存在一些属性来维护自己文件相关的一些权限信息。这里建立一个目录和文件:

ll后显示出了很多属性,这些属性中包含很多列:

先看第一列,发现有十个符号,其中Linux下第一列第一个字符称为文件类型。windows中通过文件名后缀来区分文件类型,如.exe,.txt等;Linux系统中文件名后缀没有直接的意义(不代表不用)。下面看通常有那些类型:-:普通文件;d:目录文件;b:块设备文件;c:字符设备文件;p:管道文件;等等。下面简单解释一下:像文本,可执行程序,库,基本都属于普通文件;块设备文件很明显和硬件有关,所以磁盘文件叫块设备文件,如ls /dev/vda1 -al

字符设备文件通常在Linux指字符设备,如键盘,显示器文件等,如ls /dev/tty* -l

管道文件如mkfifo fifo,可以用来通信

说完上述再来理解一下什么是Linux下文件名后缀没有直接意义呢?

如mv test.cc test.c,打开写一段代码,用gcc编译后形成a.out,此时./a.out直接运行就可以跑。把a.out分别改为a.exe和b发现也照样可以运行。所以命名随便,只要具有可执行权限就可以跑。

但是再mv test.c test.txt,此时再用gcc编译代码时发现报错,说文件不能被识别,主要原因是.txt不是C的源代码,Linux系统不以文件名后缀区分文件,但gcc是一款编译器,在操作系统上跑的软件,Linux不管后缀不代表其他Linux系统上运行的其他软件不需要后缀。那Linux中如何看待后缀问题?看用户需求,用户根据后面用不用,想带与不带后缀都可以,只是系统以显示的第一列第一个字母来做区分。接下来看第一列剩下9个符号,通过观察这些符号有r、w、x、-,这些是什么呢?因为权限和事物属性是有关系的,我们谈的更多是目录和文件的属性,所以文件的属性在它的属性里天然就应该具备我们对文件的一个读、写、执行方面的属性的设定,所以文件属性中r:可读,w:可写,x:可执行,-:对应的权限位置没有权限,这就叫文件对应的权限属性。比如校长办公室就一种属性为是否允许人进入,是否允许人进入这是办公室的属性,但最终一定要和人关联起来我们才能决定最终是否让特定角色的人进去校长办公室。所以这里的人该如何理解呢?这里的人并不代表某个具体的用户,代表的是一种权限身份或角色,Linux中将上述划分为三种:第一个叫文件的拥有者,第二个叫所属组,第三个叫其他人。拥有者代表这个文件是谁的,其他人代表这个文件不属于谁,那所属组是什么意思呢?如Linux中有10个用户同时登陆Linux,其中有6个用户属于同一组,它们可给特定文件或目录设定组级别约束,就可以保证同一组内的人可以共享某些资源,这就叫所属组。现在问题是感觉怪怪的,前面说用户有root和普通用户这两个分类,现在又说Linux下有拥有者、所属组、其他人,那这三种身份和用户分类之间是什么关系?

相当于上图右边是具体的人,左边是角色,这三个角色可由root来扮演,也可由普通用户扮演(如普通用户可以是文件的拥有者)。如校长是角色,张三是人,张三和校长一结合就是校长了,也就是说这两套概念是互相补充的。下面再看ll所列的属性:

第二列暂时不管,第三列看到的yxx信息叫该文件对应的拥有者,如empty目录的拥有者就是yxx这个用户。一个文件被创建出来属于张三就属于,不属于就不属于,为什么还有个所属组的概念呢?举个小例子:比如我和李四穿越到过去进入同一家公司,以前的年代公司里只有一台机器,大家都要做开发,公司内部有两个小组,我在A组,李四在B组,我们在同一个主机下,A和B组有不同的代码目录。现在公司要开发一个软件,交给AB组开发,说谁的好将来就用谁的。现在我写了一段代码但担心被李四看到(假设现在只有拥有者和other这两个身份),所以我对我写的代码进行权限设定时定为只有拥有者可以看,other不能看。可有一天领导想看我写的代码怎么样了,此时只有两个身份就很难受,如果把other放开领导看到的同时李四也就可以看了,这非常难受。所以设定了一个新的身份是所属组,把领导添加到共同组内,组内设好权限就可以看了,所以有了所属组的概念。复盘一下上述:1.Linux中角色会被分为三类,分别是拥有者,所属组,other。2.角色和具体的用户并不冲突,互相补充,角色未来由具体的用户承担。3.需要组内协调时又不想让other看到,多以有了所属组这样的概念。现在”人“知道了,”属性”认识了,下面两者相结合就有了权限的概念。再次ll一下来重新认识一下下图:

第一列字段叫文件类型。第二个框叫文件的权限属性。第三框暂时不管。第四框叫当前文件所对应的拥有者。第五框叫当前文件所对应的所属组(因为我的系统只有我在用,所以自己是文件的拥有者,也是文件的组长)。第六框是文件大小,单位是字节。第七框是文件最近创建或修改的时间。第八框是文件名。那other在哪里?如果我现在是root,我要访问test.txt这个文件,访问时做身份对比,看root是不是拥有者(root !=yxx),看root是不是所属组,所以root就是其他了。因此other太多了没有办法穷举,没有必要将other用户名写到文件属性里。下面看第二框,这9个字符从左向右三三为一组,第一组是拥有者的权限,第二组是所属组的权限,第三组是对应other的权限,三三为一组与拥有者,所属组,other一一对应。如上图test.txt对应的权限是:这个文件对于文件的拥有者而言它的权限是能读能写但不能执行,对于文件的所属组而言它的权限是能读能写不能执行,对于文件的其他人来说它的权限是能读不能写不能执行。

以文件拥有者权限为例来看:第一个位置是读权限,第二个位置是写权限,第三个位置是执行权限。也就是说三三为一组,每一组中每个位置是什么含义是确定的,每一个位置只有是或否,具有指定的权限。所以未来谈一个文件的时候:第一要明确我是谁,第二要知道这个文件的拥有者和所属组是谁,第三要确定拥有者和所属组和other分别各自的权限是什么。这就叫与“人”有关,与文件“属性”有关,它们一结合就是权限了。

    以前自己创建的文件中我是有权限对它做各种修改的,现在初步见一见没有权限是什么样子。右击复制ssh渠道新建立两个,用su和su ydd,现在就有了3个不同的人了。

现在test.txt这个文件的拥有者和所属组是yxx,对于yxx账号来说yxx是拥有者,所以yxx对这个文件的权限是能读能写:

再看ydd账号,test.txt文件的拥有者和所属组是yxx,相当于ydd访问test.txt时的身份是other。此时test.txt对于other的权限只有读,尝试写的时候发现不能写,报错说权限拒绝:

现在我是root账号,对于test.txt来说我的身份也是other,权限也应该只有读,但尝试写的时候发现也可以写进去,说明root是不受权限约束的:

现在我是yxx,我是文件的拥有者,那我是可以改自己的文件的属性的。比如想去掉test.txt所有人的权限,就chmod u-rwx,g-rwx,o-rwx test.txt:

此时ll后发现对于test.txt无论是什么身份都没法访问,所以我yxx作为文件的拥有者,我给自己设定的权限是什么都没有,那我自己也要受权限的约束。我yxx都不行,ydd用户更没法读写。

此时root来了,发现可以读也可以写:

所以最后的结论是如果没有权限,看到的现象是permission denied,root不受权限约束。最后再看一下,现在我是yxx,目前什么权限也没有,现在我chmod u+r test.txt给自己加个读权限:

这里访问test.txt时先识别我这个人,确认yxx是拥有者,具有读权限,此时就可以读了,这就是有和没有权限的现象。到目前关于权限问题已经把理论部分交代完了,最后总结一下:1.权限=人+事物属性,人就是角色,分别是拥有者,所属组,other,分别可能会由Linux系统中具体的某些用户来承担,如拥有者可能是root,也可能是任何一个用户。2.文件属性有读,写,执行,没有权限这样的属性,权限属性三三为一组分别和人对应。未来识别对应身份时先识别我属于哪一个角色,依次和拥有者,所属组,other做对比,识别出我是哪一种角色后再去套对应的权限。

    下面来说权限的修改问题,如何更改权限的属性呢?一般而言可以更改权限属性的只有两种人,第一种人是文件的拥有者(这东西是我的我有权限改),第二种人就是root。现在我是文件的拥有者,下面来做一下修改权限的操作:chmod u+w test.txt,想更改文件的权限属性用chmod,更改的文件是test.txt,u+w代表给拥有者加写权限:

ll后发现具备写权限了,现在想给拥有者加x权限,就chmod u+x test.txt:

ll后发现有了执行权限,至于test.txt能否./test.txt执行另外一说,类似于我有了可执行权限和我未来是不是一个真实的可执行程序是两个概念,但很明显这里赋可执行权限是不合理的,因此想给拥有者去掉可执行权限就chmod u-x test.txt:

此时ll发现拥有者就没有写权限了。现在想给拥有者去掉读写权限就chmod u-rw test.txt:

现在想给拥有者加读写执行权限:

现在想给所属组加可读和可执行权限:

现在想给other加读权限:

现在想给拥有者去掉所有权限,所属组加上所有权限,other加上读写权限:

此时想给所有人都去掉x权限就chmod a-x test.txt,a有all的意思:

想给所有人去掉所有权限:

想给所有人加上所有权限:

以上是第一种修改权限的方式,下面来谈谈第二种修改权限的方式:

权限属性三三为一组,这里以test.txt第一组为例,拥有者有rwx三种权限。因为特定位置表示明确信息,所以可以把每个权限位看作对应的二进制序列,其中第一组就可以用111来表示,代表读权限被设置,写权限被设置,可执行权限被设置。同理有010代表读权限没被设置,写权限被设置,可执行权限没被设置。所以用比特位的方式来和是否有权限一一对应,因为是三个比特位,所以最终可以用8进制方式表示拥有者权限,因为8进制是从0~7(000~111),所以也可以推而广之到所属组和other。比如未来权限可能是这个样子:111 110 110,最终代表rwx rw- rw-,把它转化为8进制是766。所以未来修改权限时可直接用8进制方案来进行修改,如想把test.txt所有人的权限都设置为没有:

再如想给所有人都加读权限:

再如想给拥有者加所有权限,所属组只有读和写,other什么权限也没有:

再如想给所有人加所有权限:

以上就是第二种权限设定方案,两种设定方案未来可以自行选择。

    现在我是yxx,那文件的拥有者和所属组怎么改呢?更改文件的拥有者用chown。比如想把文件的拥有着给ydd就chown ydd test.txt:

发现当前操作不允许。为什么不允许呢?可以想一想把一个东西给别人要不要征得别人的允许呢?答案是肯定的,所以一般把东西给别人有两种情况:1.把东西给别人征得别人同意后给别人。2.不管同不同意都强制的给。很明显第一种情况不可以,那怎样强制的给呢?需要sudo chown ydd test.txt对指令做提权,但现在是yxx不能sudo,所以用root来做:

此时看到拥有者是ydd了,此时yxx对于test.txt来说就是所属组了。yxx目前可以对test.txt进行读写,因为test.txt目前对应的所属组权限属性是rwx。下面在yxx中改一下文件的权限属性:

发现不让改了,因为这个文件的拥有者不是yxx了,文件不属于yxx了,ydd中可以改。所以在root中:

改完后只有拥有者有读写执行权限,所属组和other没什么权限了。现在在root中给所属组加读权限:

此时所属组就具备读权限了,yxx就可以读该文件。但yxx还是不能往里面写东西,因为没有写权限。所以在root中:

此时yxx就可以在文件中正常写了。这就叫我们可把文件的拥有者进行更改,更改后我的身份也就自然发生变化了。此时想把所属组给ydd怎么给呢?可以在yxx中用chgrp ydd test.txt,但是把所属组给别人也要征得别人的同意,不能暂时提升权限,只能在root下用chgrp ydd test.txt:

给完后test.txt这文件就彻底不是yxx的了,前面yxx还能对该文件进行读写,此时就不可以了。因为我yxx相对于test.txt来说已经是other了,此时other没有任何权限。所以说chmod是改文件属性的,chown和chgrp是用来改文件拥有者和所属组的。那other怎么改呢?other没有指令,因为只要把拥有者和所属组改了后other就自然被改了,所以不需要给other单独提供指令。有时想一次性把文件的拥有者和所属组改了怎么改呢?在root中chown yxx:yxx test.txt:

此时就一次性改了。此外还有个细节:

普通用户输入那里的命令行提示符是$,root用户输入那里的命令行提示符是#。最后来验证一个小问题,现在我是yxx,现在test.txt什么权限也没有,我用chmod u+r,g+rw test.txt:

此时拥有者有r权限没有w权限,所属组有r权限和w权限。那现在yxx即使文件的拥有者,又是文件的所属组,那现在我是yxx,当前我可以读文件,那我可以往文件里写东西吗?

发现不可以写。因为权限属性三三为一组,在进行认证时,依次认证,每次只能选一个角色进行认证,此时我是yxx,先认证完我是拥有者后就直接看拥有者权限了,所属组的权限看都不看。如果在root中chown ydd test.txt,此时在yxx中依次身份对比时就认证yxx是所属组,对上后就看所属组的权限。

    下面进入下一个话题:这个话题有三个子问题,这些问题都比较奇怪。所有文件暂时先不要了:

现在创建两个普通文件:

创建好后,为什么这两个普通文件的默认权限是上图这个样子?默认权限转化为8进制后是664。下面再创建两个目录文件:

现在创建了两个目录文件,它对应的权限默认是775。我们都知道满权限时是777,问题是为什么我们创建的文件的默认权限是我们所看到的样子?为什么普通文件默认被创建出来默认权限是664,目录文件被创建出来默认权限是775?下面先做一些预备:1.在Linux中默认给普通文件的起始权限其实是666。2.默认给目录文件的起始权限其实是777。可为什么和实际看到的不一样呢?原因在于Linux中存在一个叫umask的东西,我们把它称为权限掩码:

第一个0代表是八进制不用管。它的意思是凡是在umask中出现的权限(有权限),不会在最终文件的权限里出现。先解释一下为什么是664和775:

普通文件在Linux中默认是起始权限是110 110 110,umask是000 000 010,根据umask的规则最终就变为了110 110 100,也就是664;目录文件在Linux中默认是起始权限是111 111 umask是000 000 010,根据umask的规则最终就变为了111 111 101,也就是775。那经过什么样的运算才能变为最终结果呢?直觉上感觉是减法,其实不是。比如把umask改为001,那普通文件按照减法最终应该变为110 110 101,应该是665,下面来验证一下看是不是这样:

发现此时test3.txt的权限是666不是665,因此不是减法。实际最终的权限=起始权限 & (~umask)。这里把umask恢复出来验证一下:

现在删除所有文件,假如现在想让创建出来的文件或目录最终不能有读和可执行权限怎么写呢?

可以把umask改为0555,此时创建的文件就符合要求,没有读和可执行权限。所以可以用umask限定创建文件的起始权限,但还是恢复出来,umask 0002。

    下面进去第二个子问题,删掉所有文件,这里创建一个普通文件:

发现给普通文件没有所谓的x权限,这没啥问题,因为它本身是个普通文件,本来就不用执行,需要执行的时候再让系统去加可执行权限就可以了。现在再创建一个目录:

发现它默认权限基本是满的,现在想说这样一个问题:对于文件来说,要读它就cat一下,要往里面写东西就用echo去追加,执行的话未来也会有执行权限。那对于目录读,写,执行分别代表什么意思呢?对于dir来说你的权限就一定会影响你的行为,对于dir来说第一个行为是进入这个目录,那进入这个目录需要什么权限呢?

现在我是yxx,进行权限身份验证时发现我是拥有者,所以只看第一组权限,此时cd dir发现可以进去。现在退回上一个路径,再chmod a-r dir:

此时没有了读权限,再cd dir发现可以进来,但ll想看里面的东西发现权限被拒绝,再touch test.txt发现可以创建,但ls就是不让看。这个现象说明读权限不影响进入,读权限影响的是我查看这个目录下面文件列表这样的操作。再回退到上级路径,再chmod a-w dir,把dir的写权限全部去掉:

此时cd dir发现可以进去,ls不让读正常,因为读权限关闭了,下面再touch test1.txt,此时也不能创建了。

此时想更改test.txt发现不让更改,删除也不能删除,所以还影响更改和删除。现在已经基本可以确定能否进入到目录看的是有没有可执行权限。回退到上级目录,此时chmod 666 dir:

此时cd dir发现进不去了,ls dir/发现有权限不允许但还是可以看到,因为不允许进入dir,但不代表不允许查,所以就显示出来了。相当于A和B关系好,他们都和C关系不好,所以A和B在房子里贴了C不能入内,C虽然不能进去,但阻止不了C趴在窗户上看房子里面。当然直接ls dir/test.txt就不行了,所以x对目录来讲对应是否允许用户进入目录。

    下面进入第三个问题:如果你建的文件不让我读、写、可执行,那我可以删掉你吗?

上图显示出了home目录下的所有用户,以前说过创建一个用户时它们在home目录下创建名字,home/xxx就是对应的该用户的家目录。仔细观察发现每个用户的拥有者和所属组都是自己且只对拥有者有读、写、执行权限,这也就注定了我在我的家目录里建立一个文件,其他人想读或看到这个文件是不可能的。

比如我现在是yxx,我想进入到ydd目录下,发现不可以。想访问他里面的文件,发现也不可以,我连家门都进不去怎么能访问家里的其它文件呢?因为我们每个人登陆时默认都在自己的家目录下,想访问别人家目录从门口就被拦住了,当然root除外。可是有时候,我们多个用户想进行文件数据的共享,如yxx是个普通用户,ydd是个普通用户,现在yxx在文件里写了些信息,ydd也想读,这是大家的需求。但是普通用户自己的家目录权限是700,我在我的家目录创建的文件,别人都看不到以及有时候我们多个用户想进行文件数据的共享,因此我们所建立的共享文件,不能再任何一个人的家目录下。

所以现在我是root,我进入根目录,在根目录下建立一个shared。这个文件是root建的,拥有者和所有组都是root,但没事,任何人都可以以other身份访问shared。

为了普通用户互相下之间可以更好的分享,这里就把所有权限都公开。

现在两个普通用户进入到根目录,yxx和ydd对于shared来说都是other,权限都打开了,两人都可以进入到shared里面。此时yxx可以建立一个文件test.txt,在这个文件中再写点内容,这个文件是yxx建的,所以文件的拥有者和所属组都是yxx。此时ydd进入shared里面可以ll看到文件是谁写的,ydd对于test.txt是other,有读权限,所以cat可以读到该文件的内容,此时就能做到数据共享了。

比如现在yxx把test.txt文件的权限改为了只能自己看,此时ydd ll后发现test.txt这个文件不让他看了,此时读或往里面写东西都不可以,于是ydd就说既然不让我看那我就把这个文件删了:

此时yxx发现文件没有了。所以一个文件不是ydd建立的,但在共享目录下却被ydd删了,这样显然很不合理,这样的话以后yxx如果不想让对方读的话还要考虑对方会不会直接删文件这个问题。那ydd为什么能删了yxx的文件呢?一个文件能否被删除并不由文件本身决定,而由这个文件所处的目录决定。因为yxx和ydd都在共享目录下

共享目录针对other有写权限,所以ydd可以删除yxx的文件。那这问题怎么避免呢?可以在root中chmod o-w shared,此时就无法删除了,但如果我们去掉了共享目录的w权限,我们也同时无法创建文件了,任何人无法写,那这样我们的共享目录,共享体现在哪里呢?所以这样的解决方案是不可以的。在共享目录下想让所有人可以创建,但不属于自己的文件不能删,所以引入一个新的权限位叫粘滞位。

这里给other+t,t就是粘滞位,ll发现shared中的x变为了t,t也是可执行权限,只是它比较特殊。它会约束在这个目录下可以新建文件,但不能互删。

此时yxx在shared目录下建立test.txt,ydd就不可以删了。所以粘滞位是给目录设置的,一般是共享目录,大家可以在目录进行各自文件的增删查改,设置粘滞位只允许文件拥有者或root能删这个文件,其他人一律不允许,t是一种特殊的x权限。另外就算没有任何权限,root依然不受影响。最后再谈一个问题:最开始说创建一个文件需要多个用户共享,难道每次共享文件都要自己建目录吗?

可以发现普通用户是无法在根目录下创建文件的,所以未来想建立共享文件只能以root身份建立。

但其实Linux下不用建立共享目录,因为有个tmp目录,它就是Linux下的共享目录,未来用户想通信可以把文件临时的放改目录下。

相关文章:

  • [IEEE TIP 2024](cv即插即用模块分享)IdeNet信息增强模块 性能提升必备!
  • 如何用海伦公式快速判断点在直线的哪一侧
  • MCP(模型上下文协议)简单案例
  • XILINX DDR3专题---(1)IP核时钟框架介绍
  • Python及C++中的列表
  • 2025届蓝桥杯JavaB组个人题解(题目全)
  • 【音视频】SDL播放PCM音频
  • 【音视频】SDL渲染YUV格式像素
  • 十六届蓝桥杯嵌入式省赛直播基本外设驱动
  • 设计模式 Day 8:策略模式(Strategy Pattern)完整讲解与实战应用
  • Bartender 5 for Mac 多功能菜单栏管理
  • CSS >子元素选择器和空格
  • 2025年第十六届蓝桥杯省赛C++ A组真题
  • nvm list available 无法查看解决办法
  • GEO优化实战指南:构建生成式AI时代的品牌内容霸权
  • 汇舟问卷:国外问卷调查技巧有哪些,具体该怎么操作
  • Linux-内核驱动-makemenu,make modules,make uImage,杂项
  • AI编程案例拆解|基于机器学习XX评分系统-前端篇
  • DAPP实战篇:使用ethersjs连接智能合约并输入地址查询该地址余额
  • 【愚公系列】《Python网络爬虫从入门到精通》048-验证码识别(滑动拼图验证码)
  • 怎么做网站主/新网域名注册查询
  • 大型网站怎么做/百度在线提问
  • 常用网站大全/怎么把平台推广出去
  • 济宁市任城区建设局网站/新闻发布系统
  • 水果网店网站建设策划书/百度问一问官网
  • 武汉做网站优化的公司/手机清理优化软件排名