【Linux】Linux 权限:数字背后的神秘 “门禁卡” 系统
目录
- 权限的基本概念
- Linux上用户的分类
- 超级用户和普通用户
- 用户之间的切换
- 文件访问者的分类
- 文件属性与访问权限
- Linux下的文件类型
- 文件后缀在Linux中的作用
- 文件自身的属性【⭐】
- 文件访问者的三种权限【rwx】
- 文件权限值的表示方法
- 文件访问权限的相关设置方法
- chmod——设置文件的访问权限
- 修改访问者权限的两种方式
- 首次遇到Permission denied
- Linux下一个用户扮演多个角色的身份确认
- Linux下的三个重要权限【⭐⭐⭐面试常考】
- 目录权限
- 默认权限
- 文件的起始权限与默认权限
- umask权限掩码
- 位运算的细致讲解
- 最终权限
- umask修改
- umask权限掩码的作用
- 粘滞位【⭐】
- 背景及准备
- 添加粘滞位防止别人恶意删除
- 如何删除粘滞位目录
- end
权限的基本概念
就这么说吧,权限就是= 角色 + 事务属性
- 比如说我要随意的进出校长的办公室,那可能吗?这个办公室是给校长专属的,我一个学生的角色可以在校长办公室随意进出乱搞吗?这明显是不可能的,所以这就对应了我们权限中角色的要求
- 再来第二点,我要在爱奇艺这个视频软件上敲代码,大家都知道怎么可能,爱奇艺只能用来追剧,怎么还能用来敲代码,这就对应了权限要求一个事务的属性,而爱奇艺这个软件的事务属性是看视频
Linux上用户的分类
超级用户和普通用户
- 超级用户就相当于是Windows系统的管理员账户,在操作系统中,想干啥就干啥,超级用户几乎不受权限所约束。普通用户能做的,超级用户都能做,但是普通用户不能做的,超级用户也能做,后面具体将权限的时候我将具体举例说明
- 超级用户默认用户名root
- 普通用户的能力就比超级用户少得多,具体方面我也会举例说明
- 这里用户的名字自定义的,我的是ljj
用户之间的切换
切换就是两个命令
- su 用户名 (并不会改变当前路径)
可以看到路径还是ljj账户下的路径 - su - 用户名(会改变当前路径,切换到用户名所在的路径)
su - 就切换到用户名(这里是root)的路径
文件访问者的分类
- 对于一个创建出来的文件,有三种角色可以访问他。
-
- 文件拥有者(一般就是创建该文件的人)
-
- 文件所属组
-
- 其他用户
文件拥有者和其他用户很好理解,我来说一下这个文件所属组
- 其他用户
- 刚开始这个组里面只有user1一个组员,文件也只能被user1访问
- 用一个通俗的例子来解,现在你微信里面有一个好东西想给你的兄弟看,但是如果你发在班级群里面其他人也会看到,这时候你就可以单独创建一个微信群,把你的好兄弟拉进群,在你创建的微信群里面发文件,这个文件只有在微信群里面的人才能看到,群外的人是看不到的。
总结:微信群就是文件所属组,你和你的好兄弟就是组员,好东西就是文件
文件属性与访问权限
Linux下的文件类型
在Linux下,主要有以下八种文件类型,我们主要记前面两种就行,因为碰到得比较多
- 【-】 :普通文件,文本,可执行,归档文件等
【d】:目录
【b】:块设备,block,磁盘【ls -l /dev/vda1】
【c】: 字符设备,键盘或者显示器【ls -l /dev/tty】
【p】:管道设备【mkfifo pipe】
【s】:网络socket文件
【l】 :链接文件 link【ls -al /usr/lib64/】
- d开头就是目录文件, - 开头就是普通文件
文件后缀在Linux中的作用
- 可以看到,我把原来的以.out后缀名分别改成了.exe和.txt后缀依然可以运行这个文件,所以Linux系统中,一个文件的类型并不是由文件后缀名决定。
- 那我们再用gcc 编译一个文本文件
- 有人这时候就说了,你不是说Linux系统中,文件的类型不是由文件后缀名决定的吗,这里gcc为啥编译不过去,对了,我是说的是系统,那么gcc是一个系统吗,不是吧,他是一个编译软件,他并不是一个Linux自带的,相当于是一个外带的工具,他的识别文件的方式就必须要以.c为后缀名的文件,这和linux系统的识别方式不一样。
文件自身的属性【⭐】
文件访问者的三种权限【rwx】
-
对于这么多的文件属性,现在我们来重点讲解三个文件访问者的权限
在上面的文件属性中,我已经说明第一个rwx是文件拥有者的,后面两组对于文件所属组和other用户。 -
r(读), 对于目录文件,代表可以该目录的信息权限
-
w(写), 对于目录文件,代表可以修改该目录文件的属性权限
-
x(执行), 对于目录文件,代表可以进入该目录权限
-
rwx就是该访问者对文件读,写,执行权限都有
-
r-x就是该访问者对文件只具有读和执行权限,不具有写权限。
总结:以此类推,如果rwx中三个位置,如果位置上是-,代表不具有该位置对应的权限。
文件权限值的表示方法
- 对于r权限,用4来表示
- 对于w权限,用2来表示
- 对于x权限,用1来表示
也就是说,例如文件拥有者的权限是rwx,他的权限值是7,r(4) + w(2) + x(1) = 7,以此类推
- 下面用两张图来表示两种权限的表示方法
文件访问权限的相关设置方法
chmod——设置文件的访问权限
- 功能:设置文件的访问权限 格式:chmod [参数] 权限 文件名
- 常用选项: R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
修改访问者权限的两种方式
1.用户标识符+权限字母
首先是对于要修改身份的对应字符,也就是我们在上面说到的【拥有者】、【所属组】、【other】
- 拥有者 —— u(user)
- 所属组 —— g(group)
- other —— o(other)
- 所有人 —— a(all)【可以操作以上全部】
如果要修改他们的权限,也就是【rwx】以及【-】这个四种权限的状态,只需要使用到±即可。下面我来左一系列的演示
给拥有者添加【读】的权限—— r
给所属组添加【写】的权限—— w
————能够添加权限,那能不能删除权限呢?————
给拥有者删除【执行】的权限—— x
2.八进制操作
给拥有者、所属组、other都添加【读】和【写】的权限—— 666
将拥有者、所属组、other的所有权限都删除—— 000
首次遇到Permission denied
- 这里我把ljj这个文件拥有这对log.txt文件的读权限去掉了,可以看到我们现在使用cat 打印无法读取打印
- 这个时候我又把other用户的读权限也去掉,那么root也是属于other用户
- 这时候root说,你看不了,我来看,ljj用户说你拿去看吧,我自己的文件我都没有权限看,我看你也没有权限看
- 这时候可以看到,root他没有权限居然也能看这个文件,所以说,不受大多数的权限所限制root
Linux下一个用户扮演多个角色的身份确认
- 可以看到,即使ljj是文件所属组的成员,并且文件所属组是具有读权限依然不能读这个文件
- 所以意思就是进行身份确认的时候,依次确认,如果ljj既是拥有者也是所属组,那么只看拥有者的权限,这里拥有者的权限不能读,系统就确定ljj这个账号没有读这个文件的权限,直接忽略了后面所属组也是ljj具有读权限,这就是一个账号具有两种或三种身份的时候,权限的决定
Linux下的三个重要权限【⭐⭐⭐面试常考】
目录权限
- cd 进入到一个目录,需要可执行【x】权限
- ls 查看目录中的文件内容,需要读【r】权限
- touch、echo 在目录中创建文件;rm 删除文件,需要写【w】权限
- 可以看到,我们进去目录的权限并不是rw,而是x权限
默认权限
文件的起始权限与默认权限
目录文件起始权限:【777】
普通文件起始权限:【666】
- 在Linux中,我们在创建出来一个文件后,你是否有观察过访问者的初始默认权限是怎样的,也就是【拥有者】【所属组】【other】三者所组成的9位三三一组的八进制数字,我们一起来看看
- 可以看到,对于root超级用户来说,创建目录默认权限为【7 5 5】,创建普通文件的默认权限为【6 4 4】;而对于普通用户来说,创建目录的默认权限为【7 7 5】,创建普通文件的默认权限为【6 6 4】
- 这是为什么呢?目录的起始权限为【777】,文件的起始权限为【666】,让我们一起看下去吧👇
umask权限掩码
功能:查看或修改文件掩码
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为【0022】,普通用户默认为【0002】
- 可以初步看到,对于超级用户和普通用户,他们有着不同的权限掩码值,所以创建出来的文件和目录会有着不一样的默认权限
- 我们可以来查看一下普通用户和超级用户的umask权限掩码值
root超级用户
普通用户
位运算的细致讲解
- 接下去拓展一块内容,因为要涉及到最终权限的计算,所以我们再来复习一下C语言中的位运算,位运算的运算符有很多,按位与【&】、按位或【|】、按位取反【~】、按位异或【^】,这里我们主要使用到的是按位与和按位取反
复习一下位运算的知识
① 取出一个8位二进制的后四位
- 对于取出一个八进制的后四位,那我们只需要将前四位抹去,只留下后面四位即可,在按位与的运算中有这么一个逻辑,两个数按位与,只有全1才为1,只要有0即为0,那我们只需要让前四位均为0按位与,后四位均和1按位与即可
② 比特位填充
int a = 1;
- 上面这一句简单的声明变量并且给它一个初始值的语句,相信大家都写过,但是你有仔细分析过这句代码吗,我们从字节和比特位的填充角度来看看
- 整形是4个字节,也就是4B,计算机中1B=8bit,那4B = 32bit,所以变量a被分配到了32个比特位。因此我们可以这么来描述这一句代码
③ 比特位保留
int b = 1234;
b = b & 1;
- 可以看到,把1写成32个比特位的话,只有最后一位是1,所以根据按位与的规则进行运算后可以知晓展开后32位的【1234】和1进行按位与之后就只会保留最后一个比特位,b的前31个比特位都会清零
④ 按位取反和按位与的结合
- 现在我对上面的1做一个按位取反的操作,那么其32个比特位就变成了前31位全是1,最后一位是0,这么看来的话,和【1234】去进行一个按位与的运算后就会保留前31位,最后一位会被抹去,如下图所示
最终权限
- 最终权限 = 起始权限 & (~umask)
umask修改
- 对于这个【umask】权限掩码来说是可以修改的,这样就可以改变当前用户创建目录文件或普通文件时的最终权限了。我们一起再来看看
- 这时候创建目录的最终权限就不同了,因为umask掩码修改了,计算的值也就修改
umask权限掩码的作用
我们知道了最终权限是起始权限&(~umask)的结果,那么为啥要设置一个权限掩码呢?
比如说,用户说今天的需求是把最终权限改成666,你卡卡卡一段造,把最终权限一下子全部改成666,但是明天呢,用户又说把最终权限改成777,你也咔咔咔一段改,后天呢,用户说把最终权限又要改成655,有没有发现,这样维护非常麻烦,要一个一个改,如果我们维护的设备越多,越处理不过来,这时候我们为什么不设置一个快速修改的方法,就是如这个权限掩码,只需要改一个数字就可以解决所以设备。
粘滞位【⭐】
背景及准备
- 当我们在使用Linux的时候,未来可能会有一些共享目录,被所有普通用户共享,用来保存普通用户产生的临时数据。我们首先来创建一个共享目录
- 我们zs和ljj两个用户都在这个共享目录里面创建了自己的文件
-
所以zs可以看ljj的文件
-
但是这时候ljj不想让zs看他的ljj_1.txt这个文件了就把权限修改成
-
只有ljj才能读写和执行这个文件
-
这是不是很离谱了,王者荣耀吕布内行:《无法得到,那就将他彻底毁掉》
-
那这到底是为啥呢,ljj已经设置了怎么多权限还被zs删除了,接下来讲解
-
其实我在前面目录权限哪里已经说过,目录里的资源删除和修改是由目录的写(w)权限决定的。
所以我们来看看public的写权限
-
明显看到,文件拥有者和文件所属组和other用户都是具有读写执行权限的。那么有人就说了那把other的写权限去了不就可以了吗,是可以,但是这个文件是在根目录下创建的,文件拥有者和所属组都是root,把other的写权限关了,那么ljj和zs都不能在共享目录中创建和修改文件,那还共享啥呢?
-
有人说,用ljj或zs创建一个共享目录。可惜的是,这里是根目录,必须要是root才能创建文件又
-
那为啥非要在根目录里面创建呢?
我如果想要linux在不同的账号共享文件,只能在其他目录下,因为各个用户的家目录是相互隔离的,每个用户只能进对应自己的家目录。所以我们到提权到root的根目录下创建目录共享,但是却发现我们创建目录的文件居然会被other删除,是因为目录中的文件修改删除操作是由目录的w权限决定了,也就是目录是三体人,文件是普通人,普通人的生死由三体人决定,这时候如果把目录的other角色的w权限关闭,共享文件的用户也不能对目录中的共享文件进行修改了,这时候我们就不能这样暴力解决,在目录的other角色的权限中加一个粘滞位t,里面的共享文件除了文件拥有者和root账号以外都不能删除
添加粘滞位防止别人恶意删除
- 为了让大家可以共享使用这个目录,但是呢又不想让别人删除自己的文件,此时我们就引入了一个东西叫做——【粘滞位】。那如何去添加这个粘滞位呢,很简单,只需要执行下面这个指令即可
chmod +t public(目录名字)
- 在权限最后有一个t就成功添加了
- 这个时候zs再故技重施去删ljj_2.txt
- 就别想得逞了
如何删除粘滞位目录
设置了粘滞位后的目录,谁能删除自己的文件?
自己(文件的拥有者)当然可以删,还有百无禁忌的【root】┗|`O′|┛
所以对于目录来说就看other的最后一个权限是否为【t】,若是t的话表示这个目录加上了粘滞位,你是不可以删除其他人的文件的;若是没有t的话,就看other有没有【w】权限,若有的话就可以删了
end
好了,权限这块我就说清楚了,希望对大家有用,快去codIng一下吧