权限的含义
在生活中权限无处不在,比如当我们在看电视剧时的VIP用户可以看提前看视频等等,以及一些游戏的VIP用户,可以获得一些特殊的权利等等
总的来说权限就是拦截一部分人,给另一部分人权利去访问某种资源 ,也可以说是有无或者能或不能,比如我能xxx但是你不能,我可以xxx,但是你不可以
权限的本质
权限和人有关,因为权限都是对于我可以或者他可以...这里都是指的人
权限和事物属性有关,比如我们想要在一些视频软件上刷算法题,既是你是这个视频软件上的VIP,但是你仍然刷不了题
权限的限定不是针对人,而是针对某种角色,比如我是某某学校的学生,所以我可以自由的出入学校,但是这个权利不是因为我这个人,而是我这个角色,是这个学校的学生,所以我有了这个权限,因此权限=人(角色)+事物属性
在Linux的权限中人指的就是用户,事物属性指的就是文件
Linux的用户
Linux的用户分为root和普通用户
root用户又称为超级管理员,不受权限的约束
而普通用户的权利不像root那样大
普通用户要想登录root账号的话需要输入su ,然后再输入root账号的密码
而root要想登录普通用户只需要输入 su 用户名即可
简单的说就是要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令
Linux中文件的权限
输入ll可以查看文件的属性,其中第一个root表示的是用户,第二个root表示的是所属组
在之前有说过这里的文件属性开头的第一个字符表示的是文件的类型
比如 - 开头的是普通文件, d 开头的是目录文件
那后面的字符又有什么含义呢?
文件的属性权限一般有三种,r表示读 w表示写 x表示可执行权限
其次我们知道权限=人+文件属性,对于一个文件我们还要分角色进行权限的管理
就拿图中例子举例
第一个-表示的是文件类型
rw-表示的是拥有者权限
r--表示的是所属组权限
r--表示的是other的权限
也就是说这里是每三个字符表示一个组的权限,且是按照拥有者->所属组->other来进行划分的
并且这三个字符中也是有一定的规律的
第一个字符表示是否具有读权限(有就r,没有就-)
第一个字符表示是否具有写权限(有就w,没有就-)
第一个字符表示是否具有可执行权限(有就x,没有就-)
如何修改权限
一个文件的权限一般由root和文件的拥有者可以修改
第一种修改方法
chmod(文件权限属性修改)
我们以下面的例子为例,一开始log.txt是有读的权限的(有r)
当输入chmod u-r log.txt后,发现拥有者对log.txt的权限被修改了(少了个r)
现在我们要想让拥有者对log.txt文件有读的权限,只需要输入chmod u+r log.txt
另外我们还可以一次删除或增加多个权限
文件的权限不止针对拥有者,还有所属组和other的权限
他们的修改方式都是一样的,唯一变化就是绿色方框中的是g不是u
而other的区别就是绿色方框中的o
我们也可以一次性将所以人的权限都修改,只不过要注意要用逗号分开
如果对于要给所有人都加一个相同的权限输入下面的指令就可以了,这里的a表示all的意思,也就是所有人
修改权限后对于普通用户即便这个文件是自己的,但是因为被修改了权限,所以自己也要受到相应的约束,但是这只针对普通用户,root不受限制
另外有一种特别的情况就是当一个用户即是拥有者又在所属组里,就会发生拥有者的所有权限都被限制了,而所属组的权限没有限制,这个时候这个用户的权限是拥有者权限还是所属组的权限呢?
因为Linux对用户的身份只识别一次,所以当发现这个用户的拥有者权限都被限制了,那么就不会再管他是否还在所属组里面了
chown(对拥有者修改)
把文件的拥有者修改我们使用chown,也就是把文件给别人,但是给别人需要经过别人的同意,当然也可以强制给别人,但是要用到root的权限
比如输入sudu chown (用户名) (文件名),就可以把这个文件给对应的用户
上面这个命令目前用会出错,所以我们可以用su变成root再把文件给用户
chgrp(对所属组修改)
和上面的方式一样
强制给就输入sudo chgrp (所属组名) (文件名)
我们也可以将拥有者和所属组一起修改
输入sudo chown (用户名):(所属组名) (文件名)
第二种修改方法(八进制输入)
举个例子拥有者是否有读的权限,是的话就r,否的话就-,在C语言中我们学到过是可以理解成1,否可以理解成0,那么这里我们是不是也可以这样理解呢
答案是可以的,比如
110想用来表示拥有者的权限rw-
101想用来表示拥有者的权限r-x
但是我们知道有三种角色,拥有者 所属组 other,如果用二进制表示的话是不是就有点太麻烦了
所以最后是用八进制来进行写的
比如拥有者111表示rwx换算成八进制就是7
所属组011表示-wx换算成八进制就是3
other100表示r--换算成八进制就是4
所以最后我们输入 chmod 734 log.txt就可以修改了
目录权限
可执行权限(x): 如果目录没有可执行权限, 则无法cd到目录中.
可读权限®: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
可写权限(w): 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
下面我们创建一个目录
然后我们创建普通文件,发现他们默认的权限是不一样的,为什么目录创建后都默认有可执行权限呢
umask
umask是用来在创建文件时从起始权限中过滤的,他的默认值可以直接输入umask查找
他的默认值在不同的平台上是不一样的
现在我们来验证下umask是否会对文件权限有影响
先将umask的值调整为0000
然后重新创建文件和目录,发现umask的确对权限有影响
将dir和tch换算成2进制和八进制来看看
dir1二进制:111 101 101
八进制:755
dir2二进制:111 111 111
八进制:777
tch1二进制:110 100 100
八进制:644
tch2二进制:110 110 110
八进制:666
我们再对umask的值进行换算
0022 二进制:0 000 010 010
0000 二进制:0 000 000 000
将0022的二进制加上dir1的二进制后
将0022的二进制加上tch1的二进制后
综合上面的情况我们可以得出结论普通文件的初始权限的八进制表示为666,而目录文件的初始权限表示为777
再创建的过程中会因为umask过滤掉一部分权限,也就是减去一部分权限(不是简单的减法)
就比如0022的二进制表示为000 010 010,这里分成3部分表示的分别是拥有者 所属组和other
我们也可以写成- - -(拥有者) -w-(所属组) -w-(other)
也就是说当umask为0022时,因为对拥有者对应的二进制码为000,所以对拥有者没有过滤
而对所属组的二进制码为010也就是-w-,所以当所属组有w的权限时就会过滤,other也是一样的