一、Linux权限
💧Linux权限的概念
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以在linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令: su [用户名]
功能: 切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 suroot(root可以省略),此时系统会提示输入root用户的口令。
示例:
添加普通用户:adduser
从root切换普通用户:su user
从普通用户切换root用户:su root 或 su
删除普通用户(一定要是root用户才可删除): userdel -r user
【su -】 —— 让我们的root重新登录
二、Linux的权限管理
💧文件访问者的分类(人)
对于一个被创建出来的文件,总会有被访问的一天,在Linux下的访问者分为三类:拥有者、所属组、other
1️⃣文件拥有者:
- 对于文件的拥有者很好理解了,也就是这个文件就是他的,是他所拥有的
2️⃣文件的other:
- 对于文件的other也很好理解,就是外界的访问者
3️⃣文件所属组:
- 比较难理解的应该是这个文件所属组,有同学问:这个所属组是一个什么东西,一个小组吗,嗯。。也可以这么理解吧,我们通过一个工作中的小案例来理解一下
- 假设上述图为【腾讯公司】内部的两个小组,现在这两个小组共同在开发一个项目,共同使用一个服务器,此时两个小组竞争哪方的项目做得更好。某一天,小组A的员工1把代码写好保存到到了他们的目录【code_A】中,然后组长就来询问想看看他的代码写得怎么样,但是呢却看不到他写的代码,那员工就意识到原来是这个【test.c】的文件的【other权限】没有开,于是他就将这个【other权限】给开启了
- 此时组长就可以访问看到他的代码了,但是呢这个时候另一个组的员工2写代码写到一半写不出来了,在服务器上乱逛🚶然后他就“无意间”点开了【code_B】目录看到了他们的工程代码文件(当然正式的开发不会这样),而且居然还可以访问进这个【test.c】的代码文件,然后A组组长就察觉到了这件事,开始了他的操作
- 此时他就做了一些设置,将他们的工程文件代码的所属组都设置为groupA,此时小组B中的任何成员就都访问不了这些代码文件了,只有自己组内的员工才可以访问得到
我们的云服务器大部分都是我们自己在用,所以我们既是拥有者也是所属组, 当我们一某一个身份去访问某一个文件时,每一个文件都会有拥有者和所属组, 会自动匹配是拥有者和所属组,若都不是那么就是other,Linux并不会记录other是谁👨
💧用户与访问者之间的联系
上面我们讲到了用户可分为两种:root【超级用户】和普通用户。访问者可分为三种:拥有者、所属组 和 other
- 说了这么多,那他们之间是否存在着联系呢?
- 对于【root】和【普通用户】它都是一种人呢,对于【拥有者】【所属组】【other】是属于一种角色,而人呢则是去扮演各种各样的角色。比方说你在家里是爸爸妈妈的好孩子、在学校是认真学习的好同学、在公司里呢则是刻苦工作的打工人;你现在是一个孩子的角色,等你再大一个就是一个丈夫或者妻子的角色,再过些年呢你就是一个父亲或者母亲的角色。
- 所以在人生中我们都扮演这各种各样的角色:就像我们是一个普通用户可以是右边的所有角色,但是对于root而言它其实扮演什么角色都是一样的,因为在Linux在若是使用root超级用户去执行一些事情的话可以说是百无禁忌,因为它的权限最高
💧文件类型和访问权限(事物属性)
Linux系统不是以文件名后缀区分文件类型的,而是通过ll指令显示的第一个字符区分文件类型的!
💦文件类型
d:目录文件 -:普通文件(文本,源代码,可执行程序,第三方动静态库) l:软链接(类似Windows的快捷方式) b:块设备文件(例如硬盘、光驱等) p:管道文件 c:字符设备文件(例如屏幕等串口设备) s:套接口文件
实例:
💦基本权限
Linux系统中,文件的权限属性分为三类:r(读-4)、w(写-2)、x(可执行-1)
- 读(r): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写(w): Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
- 可执行(x): execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- “—”表示不具有该项权限
前面我们得知第1位是文件类型,后面的9位均为权限属性,如下:
结合先前学到的文件访问者的分类,我们可以对创建的文件进行如下的描述:
- 普通文件file.txt的拥有者具有rw可读可写权限,没有x可执行权限,所属组具有r可读权限,没有wx可写可执行权限,其它用户具有r可读权限,没有wx可写可指向权限。
💦文件权限值的表示方法
a)字符表示方法
b)8进制数值表示方法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,而真可用1表示,假可用0表示,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。如下:
💦文件访问权限的相关设置方法
chmod
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
- R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
法一:用户表示符+/-=权限字符
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
- 用户符号:
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
示例1:
减去拥有者的读权限:chmod u-r file.txt
减去所属组和其它用户的读权限:chmod g-r,o-r file.txt
加上拥有者所属组其它人的所有权限:chmod u+rwx,g+rwx,o+rwx file.txt
⚠ 注意:root不受任何权限约束,可以为所欲为,现在,我们把普通用户xzy切换到超级用户root:
此时我file.txt的拥有者和所属组均为普通用户xzy,那么我root即其它用户,按照上述权限设置,root作为其它用户不具备任何读写权限,可实际root不受任何约束:
由此可见,这里的其它用户指的是除root以外的其它普通用户。
示例2:使用三位八进制数字
此法借用上文8进制数值表示权限的知识,如下:
还使用chmod a= 来进行整体的修改:
💦修改文件的拥有者
chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
注意:给别人文件需要争得别人同意
实例:
这里并没有经过别人的同意,直接把文件给了root用户,原因就在于使用了sudo提升权限,相等于是以root的身份运行该程序,才有了强制更改的权限。不过这是针对普通用户修改文件权限需要用到sudo,如果是root用户可以直接更改不用sudo。
使用chown可以连续修改拥有者和所属组:
💦修改文件的所属组
chgrp
功能:修改文件或目录的所属组
格式: chgrp [参数] 用户组名 文件名
常用选项: -R 递归修改文件或目录的所属组
实例:
以root用户直接更改:
以普通身份更改所属组,需要sudo提高权限:
此时拥有者的权限为root,想要改变所属组的可读权限需要sudo提升权限:
💦查看或修改文件权限掩码
umask
功能:查看或修改文件掩码
新建文件夹默认权限=0666,新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是umask,则实际创建的出来的文件权限是:mask & ~umask。后文会进行详细展开。
这里我们最终创建的目录的权限值为775,最终创建的普通文件的权限值为664(不同系统可能有差异)下文会有解释。
格式: umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。
注意:凡是在权限掩码中出现的权限都不应该在最终权限出现。实际中我们只关注权限掩码的后三位。
实例:
此图很好的解释了为什么先前我们创建的目录权限为775,而普通文件的权限为664。
普通文件的默认权限是从666开始的,目录文件的默认权限是从777开始的,但是最终权限 != 默认权限。原因就在于存在权限掩码umask。这也就导致Linux最终权限 = 默认权限“去掉”umask中存在的权限。换句话说就是凡是在权限掩码中出现的权限都不应在最终权限中出现。
- 问:上述所说的去掉是减法吗?是拿普通文件或目录的默认权限的二进制减去默认权限掩码的二进制吗?
首先,umask的值是可以更改的,如下我们更改umask的值为003
如果按照最终权限是通过减法完成的,那么我们新创建的文件的最终权限值理应如下:
如若是减法,权限值为663,可实际测试的结果并不是这样的,如下:
虽然我们把权限掩码umask的值更改为003,可是最终的权限值并不是我们想象中通过减法获得的664,可见最终权限不是通过减法完成的。
- 那么最终权限到底如何计算呢?
首先,对默认权限掩码按位取反,接着拿按位取反后的结果与文件的默认权限进行按位与的操作 ,得到的就是最终权限。
综上,最终权限 = 默认权限 & (~umask)。
💦目录的权限
了解了普通文件的rwx可读可写可执行,现在来看看目录的rwx的含义:
- r可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
- w可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
- x可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.
💦粘滞位
在Linux中,可以存在一些目录,拥有者和所属组是root,其它人允许以other的身份在该目录下进行文件的创建,读取,删除,修改等(公共信息传递区)。如下的一个名为tmp的目录
该目录的拥有者和所属组均属于root,且other其它人的权限都是没有限制的,也就是说任何人都可以在里头读写文件。
总结:当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
- 一、超级管理员root删除
- 二、该目录的所有者删除
- 三、该文件的所有者删除
三、共勉
以下就是我对【Linux基础】Linux权限的深度 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对【Linux基础】Linux环境开发 的理解,请持续关注我哦!!!