目录
前言
浅谈什么是文件?
Linux下目录结构的认识及路径
目录结构
路径
家目录
什么是递归式的删除
重定向
输出重定向:
追加重定向:
输入重定向:
命令行管道
shell外壳
为什么需要shell外壳?
shell外壳是什么?
shell外壳工作机制(怎么办?)
Linux用户
Linux文件权限
引例
文件权限限制谁?
文件权限属性
为什么要有所属组?
如何修改文件权限?
可执行文件
权限角色匹配规则
root用户的权限
目录文件的权限属性
缺省权限
粘滞位
前言
这一篇文章主要介绍的是一些概念性的东西,指令不会在这里太多涉及,如果指令不熟悉的小伙伴,可以看看其他博主的常见指令总结!这一篇是我们学习Linux的基石,主要涉及原理多一点!
浅谈什么是文件?
如果我们新建了一个空文件 ,那么这个文件是否要占据磁盘的存储空间?
答案是肯定的,虽然一个文件的大小记录了该文件是0,但它指的0是文件内容为0,但文件除了文件内容以外,还具备有文件的属性,例如文件的修改时间,文件名,文件路径....,这些也是数据,既然是数据那么肯定就被计算机记录了下来!
于是我们就可以初步得出结论:文件=文件内容+文件属性
由上述结论我们可以得到一个新的结论:即当我们进行对文件的操作,一定要么是对文件内容进行操作,要么对文件属性进行操作
Linux下目录结构的认识及路径
在了解Linux下目录结构之前,我们先要了解一些前置东西
①、在Linux中,每一个目录文件都有两个隐藏文件“.”和“..”
“.”代表当前路径
“..”代表上级路径
②、依据我们的常识可以知道,目录文件之中可以放其他文件,这个文件可以是目录文件/普通文件...
目录结构
第一个问题:Linux下目录结构是怎么样的?
结论:Linux下目录结构是一颗多叉树!其中“/”目录我们称之为根目录
实际上要证明上述的结论我们需要证明两个东西,“/”是一个目录且“/”是根
若我们证明了上面两点,再依据目录之中还可以放目录的特点,我们就可以了解到它确实是一颗多叉树
1.“/”是一个目录
这一点我们可以通过ls -ld /,这个指令可以查看“/”文件的属性(若这个文件属性以d开头则就是目录文件)
2.“/”是所有目录文件的根
这个我们可以通过cd ..进行回退
我们随意进入一个目录文件,会发现不管进到哪个目录若是一直回退最终都会到了/目录且无法继续回退
再结合目录之中可以多个目录的特点,那么Linux的目录结构就是一颗多叉树并且"/"是他的根
如图所示:
这个多叉树有两个特点:
①、非叶子节点一定是目录文件
②、叶子节点可能是空目录也可能是普通文件
但虽然Linux的目录结构是一颗多叉树,但它不仅仅是一颗多叉树,它是一颗线索化的多叉树
如果我们把每一个目录文件当作一个节点,那么每个节点就有两个我们可以当成指针的东西一个指向当前节点也就是".",一个指向上级节点也就是".." (根目录的两个指针都指向自己)
而如果我们要在这颗树中找到一个节点,那也就牵扯到路径的概念了
路径
第二个问题:什么叫做路径?
对于上述路径:/dev/input/by-path
除了第一个/以外的所有/称为路径分隔符
两个/之间的一定是目录文件
而第一个/我们称之为根目录
其实路径本质上就是我们在这颗多叉树中要找到一个节点所经过的节点和路径分隔符所组成的一个字符串,从多叉树中我们能观察到,每一个节点都有唯一确定的父节点,并且父节点也有唯一确定的父节点(根节点的父节点就是自己),这就导致了找到一个文件的路径是被唯一标识的(唯一性)
但路径可以划分为绝对路径和相对路径,我们上面讨论的是绝对路径
绝对路径:以根目录开始的路径,这个路径是唯一标识的,并且这个路径不会依赖你现在所处的位置
例如:在上图中,如果要找到test.c,他所要经过的节点分别为/、home、bit、test.c,那么形成的路径就为/home/bit/test.c,它是以根目录开始的,所以它是绝对路径,这个路径不依赖你现在所处的位置的意思是若你在etc目录下,你可以直接通过这个绝对路径查看test.c的信息,若你在lib目录你也可以直接通过这个绝对路径查看test.c的信息
相对路径:不是以根目录开始的路径,这个路径会根据你现在所处的位置进行变化
补充:在Linux中,如果我们不写路径直接写文件名,那么默认是在当前路径下找这个文件
例如,若你现在是在lib目录下,当你要查看test.c时你应该先经过上级目录usr再经过根目录再经过home目录再经过bit目录最终到达test.c,这种情况下你形成的路径是../../home/bit/test.c
但若你现在是在etc目录下,当你要查看test.c时你应该先经过上级目录根目录再经过home目录再经过bit目录最终到达test.c,这种情况下你形成的路径时../home/bit/test.c
可以看到,上述两个例子中虽然都是到达test.c,但两种路径是根据你所处的位置而变化的,并且这种路径不是以/开头的,我们称他为相对路径
家目录
第三个问题:什么是家目录?
对于家目录其实不仅仅Linux有,Windows也有
当我们在Windows上登录一个用户以后,我们会默认打开桌面,对于图形化界面来说它是一个桌面,但其实本质它还是一个目录,这个桌面是存储在C:\Users\xxx\Desktop下的,所以桌面本质就是系统自动在你的家目录下创建了一个叫做桌面的东西
而对于Linux下的家目录,其实就是一个用户登录的时候默认所处的路径,未来你所写的代码,创建的文件,都建议统一放在自己的家目录下
什么是递归式的删除
我们上面说过,对于Linux的目录结构其实是一棵多叉树,这棵多叉树在系统中其实是用递归定义的,我们仔细想想递归定义的树,难道可以直接删除这棵树的根节点即视为删除吗?
肯定不可以,这样会造成大量节点没有释放,导致内存泄漏
于是我们只可以递归式的删除,所谓递归式的删除即深度优先遍历这棵多叉树,先删除叶子节点,再删除新的叶子节点以此往复
重定向
在了解接下来的内容之前,我们得先知道一个概念:Linux下一切皆文件!
换句话来说,不管是显示器、键盘等这样子的硬件,亦或是其他各种各样的什么东西在Linux下都是按照文件的方式来管理的,实际上,大部分的硬件设备,我们都能看做有读取和写入方法的,只不过有些方法可以为空,例如显示器只有写入方法,它的读取方法为空,再比如键盘只有读取方法而写入方法为空!
这么做是为了减少Linux系统的编码维护成本,它可以用管理文件的接口/调用来统一管理
输出重定向:
事实上,在Linux指令中有一个指令“echo”,它的功能是读取一个字符串打印到显示器上
我们上面说过,Linux下一切皆文件,那么上述指令换句话来说就是读取一个字符串写入到显示器文件,那么既然可以写入到显示器文件是否可以写到其他文件呢?答案是肯定的
这时就引入了我们的输出重定向“>”,如下用法
输出重定向“>”的第一个功能就是把一个本该写入到一个文件的数据写入到另一个文件,例如在上述指令中Hello,world本该被写到显示器上,但它却写到了test.txt文件
那么如果我重定向的是一个不存在的文件的话会发生什么呢?
如上,会发现如果我们重定向的是一个不存在的文件,那么输出重定向会自动创建这个文件,并把内容写入,于是输出重定向的第二个功能就是可以用来创建一个文件,如下
接下来,如果我们输出重定向的是一个有内容的文件会发生什么呢?
会发现当我们重定向的是一个有内容的文件时,输出重定向会先清空文件中的内容,再把重定向的数据写入文件,于是输出重定向的第三个功能可以用来清空文件内容,如下用法
追加重定向:
输出重定向的一个功能就是清空文件的内容并把重定向的数据写入,那么有没有场景是我既不想清空文件内容又想把重定向的内容写入的呢?
这个场景肯定是有的,并且还有针对这种场景的一种解决办法,即追加重定向“>>”,追加重定向就是不清空文件内容并且把重定向的数据写入!如下
输入重定向:
在Linux中,有一个指令“cat”,这个指令当我们不带任何参数的时候就是用户输入什么,cat给用户打印什么,如图
我们单看上面说的:“用户输入什么,cat给用户打印什么”。可能不会发觉什么
但如果我们结合Linux下一切皆文件再看呢?
那么就是cat从键盘文件中读取什么,就往显示器文件写入什么!那么实际上cat这个指令是默认从键盘文件读取的,那么我可以不从键盘文件读取从其他文件读取可以吗?
答案是可以的,输入重定向“<”即可完成这个功能,如下
上述指令可能带不带输入重定向结果都一样,但需要注意含义其实是不同的
命令行管道
head:提取文件头部内容,默认十行,可以用-行数选项设置提取的行数
tail:提取文件尾部内容,默认十行,可以用-行数选项设置提取的行数
如图指令,我们首先创建一个1000行内容的文件
我们思考一下:如果我想获得第580-600行的内容时应该如何获取?
按照之前学习的知识,我们需要用head提取出文件前600行的数据重定向到一个新的文件,再用tail取出这个新文件的尾部20行即可,如图
但这个方法有一个问题就是每次都需要创建临时文件,很麻烦而且新的文件还会占据新的空间!
于是就有了接下来的概念:命令行管道“|”
命令行管道的功能就是把一个指令的输出作为另一个指令的输入,如图
上图,是先取出file.txt的前600行,此时并不直接输出出来,而是把这600行数据放入管道中,当tail 指令需要读取数据时就从管道中读取
shell外壳
在Linux操作系统中,其实用户是没有直接与操作系统进行交互的,而用户和操作系统之间有一层结构叫做shell外壳。
实际上,我们平时说的命令行/图形化界面都是属于shell外壳,研究操作系统,狭义上来说就是操作系统内核,但由于用户无法直接与操作系统交互所以广义上的操作系统是内核+shell外壳,由此可见shell外壳在我们的操作系统学习中是非常重要的!
接下来讲的内容比较干,我将讲一个故事把为什么要有shell外壳、shell外壳是什么等内容串联起来
为什么需要shell外壳?
张三是一名性格比较内向的程序员,每天就是吃饭睡觉写代码,没什么与别人交往的能力,并且还有一个当爹的村长,有一天张三回到家以后它爸跟他说:孩子,你也老大不小了,该去找一个对象了。张三一惊:我连跟别人说话都费劲,你还让我去找喜欢的人处对象吗?但随后老爸就说:老爸把你介绍给了王婆(开婚介所的),今天晚上她会来我们家,你就跟她说说你的诉求,张三心想每天吃饭睡觉写代码也不是回事,而且王婆是方圆十里有名的媒婆,这个机会千载难逢。于是就欣然答应了。到了晚上的时候,王婆果真来了,于是张三就跟她说我喜欢隔壁如花,王婆听了它的诉求以后,当晚就去找如花了!
对于上述故事,其实张三对应的就是用户,王婆对应的就是shell外壳,如花对应的就是操作系统!
既然如此,我们思考一下上述故事中,为什么会需要王婆的存在呢?
答案显然是因为张三作为一个性格内向的程序员,不能主动追求喜欢的人,于是就需要王婆的存在
同样的,当把这个问题转化为:为什么需要shell外壳?
因为用户不能直接访问操作系统,这是从操作系统本身的易用程度和安全方面进行的考虑!
我们先讲讲操作系统本身的易用程度,若用户能直接访问操作系统,并且没有shell外壳,这就需要用户对操作系统十分了解,在用户使用操作系统之前还要对操作系统的底层十分了解的话,就好比让你开车之前先了解一下发动机原理,在你用手机之前先了解下手机制作的原理,显然是不合理的
shell外壳是什么?
书接上文,当王婆来找到如花之后,如花其实挺好奇王婆的动机,于是就主动开口问王婆来是干嘛的,于是王婆就说:村头的有个叫张三的小伙子他说他喜欢你,要不你俩试试,你看怎么样?如花心想,张三?就是那个每天都在写代码,三天洗一次澡的张三?那肯定不能同意,于是如花就跟王婆说,张三我认识,我知道他,他是一个好人,但我现在还不打算谈恋爱,你跟他说吧,咱俩不是不那么合适的,王婆带着从业十年的经验一听,心想大概率凉了,于是跑到张三家跟他说如花拒绝了他
在上述例子中,其实王婆就是张三与如花之间交流的媒介,张三把诉求告诉了王婆,而王婆把张三的话进行翻译过后传给了如花,而如花才是最终响应张三诉求的人!
同样的,shell外壳其实是用户和操作系统之间交流的媒介,用户把自己的诉求告诉了shell外壳,而shell外壳把用户的诉求告诉给了操作系统,最终响应用户诉求的是操作系统
换句话来说,shell外壳将使用者的命令翻译给核心,同时将核心的处理结果翻译给使用者
shell外壳工作机制(怎么办?)
书接上文,当王婆告诉张三,如花拒绝了他的时候,张三心里很失落,越想越不甘心,于是请求王婆再去跟如花商量一下,说不定如花是害羞呢?于是王婆就照做了,当王婆又来到如花家的时候正好是晚饭的时候,到了如花家门口,隔着窗户看到一个男的和如花一家人其乐融融,一口一声岳父丈母娘的可别提有多甜了,王婆一看,那不是隔壁村的李四吗?哎哟,我可不能再进去了,不然到时候不得尴尬死。于是第二次来到如花家的王婆还没进到人家家门就灰溜溜的跑了。王婆就跑去跟张三说,唉,如花呢你就别想了,隔壁村的李四好像都快要跟她结婚了,你再纠缠下去也不会有结果的,要不王婆再给你物色物色其他的,你觉得隔壁村xxx怎么样?张三脸色一沉,思考了许久后说:王婆啊,能不能再去帮我跟如花说说,你不是说她俩只是快要结婚了吗?这也还没结婚呢。王婆一阵无语~~,但王婆转念一想,唉不行啊,虽然这舔狗挺招人烦的,但他爹好歹也是我们村的村长,真要把他惹火了,那我的王婆婚介所也就不用开了。于是王婆就先答应下来,回到家里再从长计议。回到家的王婆就想啊,现在面临的两个问题,第一个就是如果我不去找如花的话,就会惹毛张三,张三他爹还是村长,第二个就是如果我去找如花的话,那人家都快结婚了那得多不好意思,王婆现在是进退两难,突然,王婆想到一个好的办法。第二天,王婆在BOSS直聘上发布了一个招人信息:王婆婚介所招聘实习生,月薪2000+五险一金,还给开实习证明,于是不少大学生就来了,王婆也招聘到了实习生。当招聘了这个实习生之后,王婆婚介所的生意是蒸蒸日上,王婆婚介所也打响了“王婆出马,百分之百成功”的口号,你问她为什么有这个自信?是这样的,实习生来了之后,王婆就让实习生去帮张三说媒,而结果也显而易见。当面对张三的时候呢,王婆就跟张三说已经去找过如花了,她不同意。面对如花的时候就说实习生不懂事,你俩都快结婚了还帮别人来找你。并且从此之后呢,只要是容易的安全的事王婆就自己干,而当遇到很艰难危险的事就让实习生上,如果这个实习生办砸了,就说这个实习生不懂事,对王婆婚介所的声誉也不会有太大影响。
上述王婆其实对应的是shell外壳,而实习生对应的就是子进程
shell本质上其实也是一个执行起来的程序,系统启动期间一直存在,shell外壳会在遇到一些有风险、用户自定义的指令时,自动创建子进程,让子进程去执行这个有风险、用户自定义的指令,当遇到比较安全的指令时才会自己去执行
其实每次登录Xshell时,操作系统都要给登录的这个用户的当前登录,新启动一个bash(shell),换句话来说也就是人手一个王婆
接下来还有一个概念需要分清,上述我说了一个新的名词“bash”,shell和bash之间是什么关系呢?
其实如果我们把shell比做成媒婆,那么bash就是王婆,王婆是媒婆吗?显然是的,那隔壁村有个李婆也是帮别人说媒的,她是媒婆吗?显然是的,其实shell是所有操作系统对于这个外壳程序的统称,只是在centos下的shell外壳是bash,或许其他操作系统下的shell外壳又有不同的名字仅此而已
Linux用户
在Linux系统中,用户主要被分为两种
1.root用户,即Linux系统的超级管理员
2.普通用户
我们先来聊一下如何在这两种用户之间实现切换,切换主要分为三种情况
第一种:当你是普通用户时:su root,再输入root的密码,即可切换到root用户,如下
第二种:当你是root用户时你需要切换到其他用户:su 目标用户名,root用户切换不用密码,即可切换到目标用户,如下
第三种:当你是普通用户时你需要切换到其他普通用户:su 目标用户名,再输入目标用户的密码,即可切换到目标用户,如下
在上述三种情况中,我们可以隐隐感觉到root用户应该是比普通用户的权限要大的,在权限章节会详细说明
Linux文件权限
引例
对于权限,其实不止Linux,现在我们仔细回忆一下,相信在你的生活中也到处都充满着有关权限的例子吧。例如当我们打开腾讯视频的时候,有些电影你可以看,而有些vip电影你是看不了的,除非你变成vip。再比如当我们去酒店住房的时候,如果你不交钱那么你是住不了房的吧。
实际上,在我们的生活中权限一定是用来限制人的,限制人能做或者不能做,当打开腾讯视频看电影的时候,只有两种结果,第一种看得了,第二种看不了,
讨论了上面的问题接下来我们聊点奇怪的,你会在腾讯视频刷算法题吗?
相信现在读者的心里肯定想的是,我为啥要去腾讯视频刷算法呢?我又没病
确实,没有人会去那里刷算法,因为腾讯视频只有看电视的功能,它不具备刷算法题的功能,换句话来说你充几十万都没用,因为它压根满足不了用户刷题的需求。所以我们得出结论:对应操作对象,一定要有对应的满足人的需求的属性。换句话来说权限限制的东西一定满足了人的需求!
总结:
1.权限是限制人能与不能的
2.对应的操作对象,一定要有对应的满足人的需求的属性
接下来我们回到Linux
文件权限限制谁?
前面我们说过Linux下一切皆文件,那么我现在告诉你Linux有权限管理,那么它是管理谁的权限呢?
显而易见嘛,管理的是文件的权限
那么文件权限限制的到底是谁呢?前面说过权限限制的是人,那人的话可就太宽泛了,张三是不是人呢?李四是不是人呢?那权限限制的到底是张三、李四这个人还是什么其他的东西呢?
其实文件权限限制的对象是某种身份,就好比你在学校上学,宿舍给你开放,食堂给你开放,并不是因为你是张三,而是因为你是学校的学生。再比如当你充了腾讯视频年费以后,给你看vip视频了,人家也不是因为你是张三,而是因为你是vip。同样的,对于一个文件来说它看的也是身份,而这些身份主要分为(拥有者、所属组、other)
我们搞懂了上述概念以后,还有一个问题,对于一个文件来说,它有什么属性?换句话来说它满足了用户的什么需求?
文件权限属性
其实对于文件来说,它的权限属性主要是三个:读、写、执行
在Linux中,用ll指令查看文件的属性信息的时候会给出上述的信息,如图
其中,首列的信息,除了开头(“-”)以外的9个字母/“-”按顺序三个为一组表示的是拥有者、所属组、other的读写执行权限, 若为字母则表示的是该对象有该权限,若为“-”表示的是该对象无该权限,其中r表示的是读,w表示的写,x表示的执行
例如第一组rw-表示的是拥有者有读写权限,没有可执行权限
第二组rw-表示的是所属组有读写权限,没有可执行权限
第三组r--表示的是other有读权限,没有写和可执行权限
而在上图中的两列yyf,首列表示的是该文件的拥有者,第二列表示的是该文件的所属组
若访问文件的用户即不是拥有者也不是所属组则就是other
为什么要有所属组?
但此时,我们又面临了一个问题,拥有者和other其实都挺好理解的,一个是文件的创建者,一个是除了文件创建者外的其他人,问题是这个所属组为什么要有?有什么场景是需要它的嘛?
若要搞清楚上述的问题,我们先假设如果没有所属组,在如下场景下会发生什么!
小李和小张同是一家公司的程序员,但他俩属于俩个不同的小组,小张在A组,小李在B组。公司在近几个季度亏损严重,于是老板重新设计一种策略,让俩个小组同时开发一个产品,最后俩个小组开发的产品先在公司内部进行竞争,胜者的产品投放到市场。但不幸的是公司由于多个季度的亏损,现在只能让俩个小组在同一台服务器上进行开发,A组在/home/A目录下开发,B组在/home/B目录下开发。于是日子就这样有条不紊的过的。但有一天管理A组和B组项目的领导听说A组的小张代码写的非常不错,领导就好奇的去问小张能不能把你的文件权限放开给我看看你的进度。小张当然非常愿意,但现在面临的一个问题是由于Linux中只有拥有者和other的概念,那么虽然领导和小张的关系非常好,但在系统中领导就是属于other,如果小张把other的权限放开了,那么隔壁B组的小李也就能看到,那么A组的项目进度等就会暴露,有没有什么办法能解决这种情况呢?
如果只有拥有者和other的话,上述情况是无法解决的,于是Linux就引入了所属组的概念,当有了所属组以后小张就可以把领导添加进所属组,而B组的人还是other,小张给所属组开放读权限就完美解决了这个问题!
ok,我们了解完上述的之后,接下来谈的话题就是如何修改文件权限
如何修改文件权限?
当修改文件权限的时候,我们用到的是chmod指令,当用此指令时我们把u称为拥有者,g称为所属组,o称为other,a表示所有身份,+表示给某身份添加某权限,-表示给某身份删除某权限,r表示读权限,w表示写权限,x表示可执行权限,具体如下
chmod u+r File //表示给拥有者File文件的读权限
chmod g+rwx File //表示给所属组File文件的读写执行权限
chmod o+rx File //表示给other File文件的读和执行权限
chmod a+rwx File //表示给三种身份File文件的读写执行权限
chmod u-rw File //表示删除拥有者的读执行权限
而除了上述直接指定的以外,我们可以把权限用三位八进制数来修改
首位的八进制数表示的是拥有者权限,第二位的八进制数表示的是所属组权限,第三位八进制数表示的other权限,如下
若一个文件权限属性为rw-rwx-wx,则每个权限位都能用二进制0,1表示有/无
则上述权限用二进制表示出来就是:110111011
我们再把9位二进制数分成3组
(拥有者)第一组:110(八进制表示后)->6
(所属组)第二组:111(八进制表示后)->7
(other)第三组:011(八进制表示后)->3
于是我们就可以通过chmod 673 File,把File文件的权限属性改为rw-rwx-wx
可执行文件
在上述表述中我一直都说文件有可执行权限,那么有可执行权限的文件就一定可执行吗?我们来试试,如下
会发现,随便一个文件给了可执行权限后是无法执行的,一个文件是否可执行取决于两个条件
1.该文件是否是可执行文件
2.是否有可执行权限
权限角色匹配规则
在如上指令中,我们新建了一个文件并给他写入了一些数据,那么当我把拥有者的读权限去掉后就无法读这个文件了,很好理解。但接下来面临的一个问题是,虽然新建这个文件的用户是拥有者,但这个用户同时还是所属组啊,这个用户拥有两个角色,并且所属组可是有读权限的。当拥有者没有读权限的时候难道Linux不会把这个用户的读权限匹配到所属组吗?
没错,确实不会匹配到所属组,对于一个文件来说,访问它的角色无非就三种,拥有者、所属组、other,当它匹配的时候它会先把访问它的用户与拥有者进行匹配,如果没有匹配上才会去看它是否属于所属组,如果还没有匹配则把用户匹配为other
那么如果把用户与拥有者匹配上了,那么就不会再去匹配所属组和other,换句话来说只会匹配成功一次,也就是确定了你的身份后不会再进行匹配
root用户的权限
在前面讲用户的时候其实就已经埋下了种子
root用户不受权限限制
上述这句话什么意思呢?也就是你不管如何设置权限,把一个文件三个角色的所有权限都关闭,它都能进行访问,权限在root眼中形同虚设,当你用root用户操作时不会出现Permission Denial的情况。
目录文件的权限属性
上述我们说的关于文件权限都是拿普通文件来举例,那么目录文件的权限属性是限制了什么呢?
1.若某人访问目录文件时没有读权限,那么无法查看目录文件中的文件的属性
2.若某人访问目录文件时没有写权限,那么无法在该目录文件下新建、删除文件
3.若某人访问目录文件时没有可执行权限,那么无法进入该目录中
上述我们注意到,其实一个文件是否能被删除不取决于文件本身的权限属性,而是取决于存放它的目录文件的权限属性!
缺省权限
首先对于一个非可执行的普通文件来说,默认是没有可执行权限的,如果需要的话就自己添加!这是因为就算有可执行权限而文件不是可执行程序的话也是无法被执行的。(rw-rw-rw-)
对于一个目录文件来说,它被创建之后别人肯定是要进入到这个目录文件进行操作的,于是目录文件天然就带有可执行权限
接下来要聊的两个问题如下:
1.为什么创建普通文件的时侯权限不是rw-rw-rw-,而是rw-rw-r--
2.为什么创建目录文件的时候权限不是rwxrwxrwx,而是rwxrwxr-x
在Linux中,有缺省权限的概念,即当我们创建文件时默认的权限就是缺省权限!
缺省权限还跟一个概念有关:umask
在Linux中,我们可以用指令umask查看自己的umask值
[yyf@VM-24-5-centos ~]$ umask
0002
此时会出现一个四位数,我们把首位忽略,我的umask即002
这三个数字分别都是8进制数
第一个0表示的是拥有者
第二个0表示的是所属组
第三个2表示的是other
umask可以通过指令修改
[yyf@VM-24-5-centos ~]$ umask 222
[yyf@VM-24-5-centos ~]$ umask
0222
缺省权限的计算是把umask每一位上的八进制数首先转换为二进制数
umask222:010 010 010
然后在这个文件起始权限的基础上,umask为0的位不动,umask为1的位去除这一位的权限
例如假设File是一个普通文件(起始权限666,umask 222)
File 起始权限:110110110
umask:010010010
File创建出来的权限:100100100 = 444
-------------------------------------------------------------------------------------
[yyf@VM-24-5-centos ~]$ umask
0222
[yyf@VM-24-5-centos ~]$ touch File
[yyf@VM-24-5-centos ~]$ ll File
-r--r--r-- 1 yyf yyf 0 Apr 16 15:12 File
[yyf@VM-24-5-centos ~]$
实际上,缺省权限 = 起始权限&(~umask)
粘滞位
在实际开发中,我们有一种场景,就是当我们多用户共用一台服务器的时候难免需要共享数据,于是我们就在根目录那创建了一个共享目录,对于这个目录,我们的需求是所有人都能在这个目录下传文件,但此时面临的一个问题是,如果我们需要所有人都在这个目录下传文件,那么肯定是需要这个目录的写权限的,但写权限可不只有新建文件的权限,还有删除文件的权限。那么假设所有人都能在这个文件下进行随意的新建和删除肯定就是不合理的,于是Linux就引进了粘滞位的概念!
粘滞位:给目录中的other设置的一个权限位,具有x的意义,同时也进一步对目录权限进行特殊限定,即该目录里面的文件,只有root或者文件的拥有者有权利进行删除!其他人一概不允许
chmod o+t 目录名,即可给目录文件添加上粘滞位,如下
[yyf@VM-24-5-centos ~]$ mkdir share
[yyf@VM-24-5-centos ~]$ ll
total 4
drwxrwxrwx 2 yyf yyf 4096 Apr 16 15:22 share
[yyf@VM-24-5-centos ~]$ chmod o+t share
[yyf@VM-24-5-centos ~]$ ll
total 4
drwxrwxrwt 2 yyf yyf 4096 Apr 16 15:22 share