目录标题
- 什么是权限
- 人的分类
- 为什么会有所属组
- 查看文件属性
- 文件的分类
- 如何查看权限
- 文件不同权限的表现
- r
- w
- x
- 权限修改
- 八进制权限修改
- umask有关内容
- 文件中人的修改
- 目录不同权限的表现
- r
- w
- x
什么是权限
首先来看一个例子:比如说我没有爱奇艺的vip,那么我也就没有权限观看爱奇艺这个平台下的vip视频,我有qq音乐的vip那么我就有权限在qq音乐这个平台下听周杰伦的歌,看了这两个例子想必大家应该能够知道权限对于人来说就是限制一个人或者一个群体能不能干一件事情,好!我们再来看两个例子:我们生活中的桌子是用来盛放物品方便我们吃饭的,那这个桌子能够吃吗?这个桌子可以用来洗澡吗?很明显是不能的。我们平时看视频用的app比如说西瓜视频腾讯视频,这些app能是用来做oj题吗?玩3A大作吗?很明显也是不能的,因为这些app没有做oj题和玩3A大作的能力,换句话说就是没有权限来实现上面的功能,这两个例子都是针对物的,权限对于物来说就是一件事情能不能被做,好!看了上面的四个例子,我们可以知道权限既可以作用于人也可以作用物,那这里权限的概念就是一个人或者一群人能不能干一件事,以及这件事能不能被干。这是生活中权限的定义,那在linux操作系统中权限一般都是针对文件而言,一个人能不能对这个文件进行修改能不能阅读一个文件能不能执行这个文件都是linux的权限决定的,如果一个文件本身就没有可读可写的权限的话那不管是谁都无法读写,这就是linux中的权限即对人也对物。
人的分类
linux操作系统将人分为了三类分别是:文件拥有者,文件所属组,其他人。
为什么会有所属组
在公司创建初期资源都非常的有限,多个小组只能使用一个机器来进行开发,而且有些公司在实现一个项目的时候会安排多个小组同时来做这个项目,做的最高的小组才能得以获胜,比如说当初微信app在被开发时候就有多个小组在做,最后由QQ创始人带领的小组获胜最终才有大家现在看到的微信,那再回头看看这里的所属组为什么会有所属组这个东西呢?好这里我们先假设没有所属组这个东西,linux中将人分为两类:文件拥有者和其他人,然后这里有一个项目由两个小组进行开发并且在同一台机器上面:
在项目开发的时候一般都有领导检查你代码写的情况或者同一个团队的人员查看你的代码学习一些东西,而你是文件的拥有者他们是这个文件的other,他们想要查看这个文件的内容的话就只有两个方法,第一把你的密码告诉他们,他们登录你的账号查看想要的内容,但是这个时候你就只能被强制下机了,等他们看完之后才能上线,第二就是把该文件的其他人的权限打开,这些人作为其他人的身份查看你的代码,但是这里就存在了一个问题我们把其他人的权限打开之后团队B的人也能看到我们的代码,他们这时候就可能从我们的代码中搞到一些有用的东西放到他们的项目里面,这样话就会对团队A的项目就会造一些损失,这么看的话上面的两种方法好像都不是非常的有利于项目成员的交流,所以这个时候linux就给出了一个身份叫所属组,把团队的成员都放到这个所属组里面,这样就可以将团队的成语与其他人分割开,即方便了团队内的交流与学习又保护了自己的文件不被其他人盗取,那么这就是所属组存在的意义。
查看文件属性
首先通过ll指令来看文件的属性比如说下面的操作:
这里就是ll指令显示的结果,我们来解释一下这里显示的内容分别是什么意思:
首先每一行的第一个字符表示的是文件类型,如果是该文件是目录的话就会显示d,如果是普通文件的话就会显示 - 。在文件类型这一块linux和Windows的区别就有点大,windows的文件类型与后缀有关,比如说可执行文件的后缀就是.exe,而在linux中文件类型和后缀是没有关系的,linux的后缀仅仅只是给用户提供一个提示符的作用,后缀的本质还是文件名的一部分,要想查看文件的真正的类型还是得通过ll指令显示的第一个字符来进行确定,但是有小伙伴看到这里就感觉不对劲了,我们之前使用gcc编译器编译文件的时候,该文件必须得加个点c后缀,不然无法生成可执行的文件,你不是说Linux系统中对后缀没有要求的嘛,怎么这里就有要求了呢?那么这里大家得注意的一点就是linux操作系统确实对后缀,没有要求但是这并不代表着Linux操作系统上的软件对文件的后缀没有要求,我们之前使用的gcc编译器他其实是Linux操作系统上的软件,这个软件需要查看文件的后缀,对文件名有要求这里大家得区分开
这就是第一个字符所代表的意思我们继续往后看,接下来的每三个字符为一组一共有3组:
那么这三组字符分别表示三类人对这个文件可以执行的权限,左边一组是文件拥有着可以对这个文件执行的权限,中间一组是文件所属组拥有的权限,右边的一组是其他人对这个文件拥有的权限,至于这里的权限能干嘛我们后面再聊,再往后看有一个数字2
这个2表示的是连接数,那什么是连接数,这就得学到后面才能跟大家解释清楚了,再往后看有两个root
第一个棕色括号里面的内容对应的是这个文件的拥有着,第二个棕色括号里面的内容对应的是这个文件的所属组,那么不在这两个括号里面的人就都是other,这里两个棕色括号里的内容都是root,所以这个文件的拥有者和所属组都是root,除了root外其他人对于这个文件都是other,再往后还出现了一个数字
这个数字表示的意思是这个文件或者目录的大小,这里显示的是4096,所以folder1目录的大小就是4096个字节,那么这里就有个问题我们之前创建一个空白文件时,用ll显示的大小是00,难道这个文件在硬盘中装的内容真的是0吗?比如说下面的操作:
这里的tmp文件为,那么这个文件在硬盘上占用的大小也为0吗?答案很明显不是的,因为一个文件在磁盘中所占的大小是由文件的内容大小加上这个文件的属性决定,一个文件的内容可能为0,但是一个文件的属性一定不为0,而这里显示的0指的是这个文件的内容为0,而不是这个文件在硬盘上占用的空间为0,这里大家得注意一下,接着往后就出现了一段时间:
这个就是与这个文件有关的时间,这里大家知道就行,最后一个就是这个文件的名字:
那么这就是文件权限的介绍。
文件的分类
第一个:
- 表示的普通文件比如说:源代码文件,库文件,可执行程序,文件压缩包等等,
第二个:
d 表示的是目录文件,也就是文件夹。
第三个:
c 表示的是字符文件这些文件就是专门用来管理键盘显示器的,我们可以在/dev/tty中看到这些文件:
第四个:
b 表示的是块文件,这些文件就是专门用来管理硬盘的,我们可以在/dev/vada1中看到块文件:
第五个:
I 表示的是链接文件,这个文件就相当于我们windows中桌面的图标,这些图标就是一个个的链接文件,最明显的特点就是我们将这些图标删除不会影响软件的本体。
第六个:
p 表示的是管道文件,我们之前使用的 l 就是管道文件的一种,比如使用mkfifo指令就可以创建一个管道文件
第六个:
s 这个就表示的是socket文件,至于这个是啥我们以后再了解。
如何查看权限
一个人如果有完整的权限的话,那么在对应的权限位置上显示的内容应该是rwx,这里的r是读权限,w是写权限,x是执行权限,并且权限在显示的时候永远都是以rwx的顺序进行显示,如果某类人没有一些权限的话,那么在这些权限的对应位置上显示的就是-,比如说某人只有读和写的权限,那么这里在显示的时候就是rw-,如果一个人只有写权限的话这里显示的就是-w-,如果一个人什么权限都没有的话这里显示的就是- - -,我们来看看下面的图片:
这是一个文件夹,这个文件夹对于拥有者来说有读写执行的权限,但是对于所属组或者其他人来说这个文件夹就只用读和执行的权限没有写权限。
这是一个普通文件,对于这个文件的拥有者来说只有读和写的权限没有执行的权限,对于这个文件的所属组或者其他人来说的话这个文件只有读权限,没有写和执行的权限。那么这就是文件权限的看法。
文件不同权限的表现
r
我们来看看下面文件的权限:
这里有个test2文件这个文件的拥有者没有读权限,我们使用echo往这个文件里面输入一个字符串然后使用cat读这个文件时就可以发现操作系统阻止了我们这里的操作因为我们没有权限:
但是这里的编译器没有阻止我们显示文件的内容,那这是为什么呢?原因很简单我们时root用户,root用户时不会受到权限的限制的,那这里我们将角色进行切换换成wj,再来执行一下上面的操作:
我们就可以看到这里操作系统就阻止了我们查看这个文件的内容,但是有些小伙伴就好奇了啊,虽然文件拥有着没有读文件的权限,但是我们还是这个文件的所属组啊,所属组拥有读文件的能力,那为什么这里依然不让读文件呢?那么这里的原因就很简单了,因为这里的角色匹配时是else if关系一旦匹配成功了就不会继续往后进行匹配了,所以这里我们即使还是所属组也不能读这个文件。
w
这个是写权限,当我们没有这个权限后无法往一个文件里面写入内容比如说下面的操作:
这里就禁止我们将内容输入到文件里面。
x
首先我们创建一个文件,然后使用nano往这个文件里面输入一些可以执行的代码:
然后再使用这个文件生成一个可执行程序:
我们可以看到这里生成了一个可执行的tmp文件,那么我们作为对比我们在此路径下再把该文件再复制一份:
将tmp文件的拥有者权限进行修改:将可执行权限去掉:
然后我们先执行一下tmp1文件就可以看到这个文件时正常运行的:
这里输出的时候忘记加换行了,所以这里看的就有点难受,然后我们再执行一下这里的tmp文件就可以看到这个文件是没有权限执行的:
那么这就是x权限的作用。
权限修改
chmod指令可以用来修改人员的权限其形式如下:
u代表的是拥有者,y代表的是所属组,o代表的是其他人,a表示所有人,如果你想增加权限的话就使用+,如果你想删除权限的话就使用-,对应的权限就是r w x,当然这里的权限可以是一个组合比如说rwx,rx,wx等等,最后再加上你想要修改的文件,那么这里的操作就如下:
一开始所有人对test1文件的权限都是没有的,我要是想让test1文件的拥有者有读权限就可以使用下面的指令:
如果我想让test1文件的所属组拥有读和执行的权限的话就可以使用下面的操作:
如果我想让test1文件的其他人拥有读写执行权限的话就可以使用下面的指令:
如果我想让test1文件的所有人都没有任何权限的话就可以使用下面的指令:
当然这里的修改还可以连续的将多人进行修改,比如说我想让拥有者的权限变为rx让其他人的权限都变成rwx的话就可以执行下面的操作:
八进制权限修改
文件的权限用rwx来表示,如果哪个权限没有的话对应位置上的内容就变成了-,那么这里我们就可以把 - 当成0,把r w x 都看成1比如说rwx就是1 1 1,r - x 就是101 ,r - -就是000,那么这里我们就可以根据这个逻辑列出一个表出来
一个人的权限可以由三个二进制数字来表示,而3个二进制数字可以合成一个8进制数字,一个文件有3类人,所以就有三个不同的权限来进行表示,所以一个文件就应该有三个八进制数字来表示权限,比如说一个文件的权限分别为:rwx rw- r-x那么这个文件的权限就可以用765来进行表示,如果一个文件的权限为 - - - -w- r-x的话,那么就可以使用数字025来表示文件的权限,既然一个文件的权限可以使用数字来表示的话,那么这里我们也可以用数字来修改一个文件的权限,那么修改的形式就是如下:
比如说一个文件的开始权限为000,我们要想将这个权限修改成rwx rwx rwx的话就可以这样进行修改:
如果我们想把这个文件的权限改成r-x rw- r- -的话就可以使用下面的指令:
那么这就是八进制权限修改法,希望大家能够理解。
umask有关内容
我们首先来看看下面的操作:
创建了一个文件夹和一个普通文件,我们通过ll可以看到这里文件的起始权限是rw- rw- r- -,而文件夹的起始权限为rwx rwx r-x那这是为什么呢?答案是跟umask的值有关,往命令行中输入umask就可以看到umask的值:
umask值为0002第一个0表示后面的三个数字都是八进制,我们将三个八进制数字展开成二进制就变成了这样:000 000 010,这里得将这些数字看成权限,所以这里umask的权限就变成了- - - - - - -w-,而umask的概念是权限掩码就是凡事在umask中出现的权限在文件或者目录中都得去掉,linux规定:目录的起始权限为777也就是
rwx rwx rwx 普通文件的起始权限是666也就是rw- rw- rw-,而umask中的other有写权限,所以目录和文件在创建的时候就得将other中的写权限去掉,所以目录在创建的时候权限就变为了rwx rwx r-x,文件的权限就变成了rw- rw- r–,那这里我们可以验证一下上面讲的内容是否是对的:
我们讲umask的值进行修改,改成了777然后再创建文件或者目录的话就可以发现这里的起始权限都没有了:
我们还可以讲umask的值设置为444这样我们创建文件或者目录的话就都没有读权限:
这里大家注意的一就是umask不是单独的减法,而是通过下面的公式来算出的最终权限:
umask要去掉的权限位是1,要保留的权限位是0,使用~反转权限后就变成~umask要去掉的权限是0,要保留的权限是1,最后再使用&操作可以让起始权限中与~umask对应的位置为0的数字都变成0,就是~umask为0的位置起始权限也变成了0,最终达到权限删除的作用。
文件中人的修改
使用chown指令可以修改文件的拥有者,使用chgrp指令可以修改文件的所属组,这两个指令的用法如下:
这里我将用户改成了root,如果是普通用户要使用这个指令的话得用sudo进行提权,那么这里的操作如下:
如果是普通用户不适用sudo提权的话,是无法修改这里的人的:
这里的chown可以连续修改拥有者和所属组,其用法如下:
那么这就是chown和chgrp的用法,希望大家可以理解。
目录不同权限的表现
普通文件的权限是rwx,文件夹的权限也是rwx,但是文件夹的rwx和普通文件的rwx的表现是不一样的,我们来看看下面的操作:
r
如果一个人没有这个文件夹的读权限的话是无法查看这个文件夹的内容的,比如说下面的操作:
然后我们将folder1文件夹的读权限去掉
然后我们再进入这个目录查看这个文件夹的内容时就可以看到我们没有权限查看这个文件夹的内容:
那么这就是文件夹的r权限,没有这个权限我们无法查看文件夹里面的内容。
w
没有文件夹的w权限我们就没有办法在文件夹里面创建文件夹以及其他文件,比如说下面的操作:
x
没有文件夹的x权限就无法进入文件夹,比如说下面的操作:
那么这就是linux中权限的所有内容希望大家能够理解。