一、权限的基本知识
1、权限的本质
权限是通过一定的条件,拦住一部分人,给另一部分人权利访问某种资源。
权限与角色,事物的属性有关。
权限 = 角色 + 事物属性
2、Linux用户分类
root:超级管理员,不受权限约束(提示符#)
普通用户:受到权限约束(提示符$)
3、普通用户和root之间的身份切换
(1)普通用户到root
su su指令能把身份从普通用户转成root
su - 不仅身份转换到root,还会进入root的家目录/root(退出ctrl + d)
普通用户到root,要输入root密码
(2)root到普通用户
su 用户名
4、指令提权
有一些指令只能有root来做,当我们是普通用户时无法使用,这时候我们就需要短暂的指令提权,让我们以root身份去执行某些指令。(但此时我们依然是普通用户)
指令前面加sudo即可。
问题
为什么指令提权是输入普通用户密码?
因为要匹配白名单,即root让某些用户用sudo才能用,其他用户不能用。(这涉及到配置文件的修改)
5、Linux中的三种角色
(1)拥有者:顾名思义就是文件或目录的拥有人。
(2)所属组:文件或目录的所有者所在的组的用户,方便多人操作文件,更细致的权限管理。
(3)其他人:我们称other,不是拥有者,所属组的用户全是other
上图中红色框里面的两个用户分别是test.txt文件的拥有者和所属组。那为什么不显示other呢,因为除了拥有者和所属组,其他用户都是other
6、补充知识
上面我们提到普通用户和root,又提到拥有者,所属组,other,他们之间有什么关系呢?
普通用户和root都是具体的人,但是拥有者,所属组,other,是三种不同的身份,有些普通用户可能在一个文件里是拥有者,在另一个文件里是other
所以两组概念是相互补充的。
二、文件权限
1、文件的三种权限
上图红框标出的就是文件目录的权限,共有十个字符。
第一个字符代表文件类型,- 代表普通文件,d代表目录。
后面九个字符三个为一组,分别代表拥有者,所属组,other的三种权限
r:读文件权限
w:写文件权限
x:执行文件权限
2、修改文件权限
chmod [角色(拥有者u,所属组g,other o,所有人a)]+/-[文件权限rwx][文件名]
当然root作为超级管理员,不受文件权限约束。
值得一提的是Linux对用户身份的识别只进行一次,当你既是拥有者又是所属组,你的身份是拥有者。
就像这里,我们既是拥有者也是所属组,而所属组有读权限,但是cat指令不被允许就是因为识别一次身份我们是拥有者。
3、修改身份
root修改拥有者:chown 用户名 文件名
root修改所属组:chgrp 用户名 文件名
普通用户修改拥有者:sudo chown 用户名 文件名
普通用户修改所属组:sudo chgrp 用户名 文件名
同时要改多个人的身份用户名之间用 : 隔开
4、修改文件权限的另一种方式
以-rw-rw-r--为例,我们知道拥有者权限是rw-,所属组权限是rw-,other权限是r--,若以二进制的眼光来看的话分别是110 110 100,转换成十进制(八进制也是一样)就是6 6 4,所以我们可以chmod 777 filename 来表示filename这文件的权限是-rwxrwxrwx
5、文件类型
在上文中提到 - 代表普通文件,d代表目录,下面还会介绍一些文件类型。
b:块设备文件,例如磁盘
c:字符设备文件,显示器的本质就是字符设备文件
p:管道文件,用于进程间通信
l:链接文件,类似windows中的快捷方式
6、补充知识
(1)Linux中的文件后缀
我们知道在windows中文件后缀代表文件类型,一旦修改很有可能文件就打不开了。
但是在Linux中不以文件后缀来区分文件类型,只由文件属性第一个字符决定,但是Linux不区分后缀不代表Linux里面的工具不区分后缀,例如gcc,若编译的文件后缀不是.c就无法执行指令。
(2)可执行
上面提到文件属性x表示可执行属性,但是文件是否可执行并不取决于文件是否有可执行属性,若文件本身无法执行就算带了x依然不会执行。
所以可执行 = 可执行属性 + 可执行文件
(3)权限掩码(umask)
我们默认创建的目录和普通文件权限分别是775(rwxrwxr-x)和664(rw-rw-r--),这是为什么呢?
普通文件起始权限是666(rw-rw-rw-)目录起始权限是777(rwxrwxrwx)
我们发现在创建时other都会少去w写的权限,这符合常理,毕竟谁也不想外人去随意修改自己的文件。那其实在文件创建的过程中会有一个权限掩码来修改文件起始权限,让我们文件创建出来与起始权限不一样。
上图中的权限掩码就是0002,后三位对应修改文件的起始权限。
具体修改规则:最终权限 = 起始权限 & (~umask)
要修改umask就用指令umask xxxx即可,查看umask就用指令umask
三、目录权限
1、想要进入一个目录,需要的权限是什么?
r:用户能查看目录中文件信息
w:用户能对目录文件进行修改,删除,新建
x:可执行权限
其实需要的权限是x
2、在目录中删除文件
在目录中删除文件与文件本身没有关系,和所在目录的w权限有关系。
3、共享文件
在实际开发中我们有需求要多人合作,但是之前的操作都是在个人的家目录中进行,而家目录与其他普通目录最大的不同就是家目录的权限是drwx------,也就是说只有拥有者才能操作家目录,这明显不符合多人开发的需求。
所以我们可以在系统的非家目录中创建共享文件,先是由root创建一个共享目录,在共享目录中任何人都可以创建共享文件。而此时的共享目录需要对other放开权限。
那不免就会产生一个问题:如果是传统的other权限rwx那么在共享目录中任何人都可以删除任何文件,不管文件是不是自己的,这显然也是不对的。
解决的办法就是引入粘滞位,把目录权限设成drwxr-xrwt,other的权限从x变成t,就说明我们设立了粘滞位,作用就是在里面的共享文件只有root,目录的所有者(基本上都是root,毕竟共享目录就是root创建的),文件的所有者才能删除文件,其他人都不行。