Linux权限
- 引言
- 文件访问者的分类
- 文件类型与访问权限
- 文件类型
- 访问权限
- 文件权限值的表示方法
- 修改权限的指令
- chmod修改文件权限
- 通过角色+/-/=权限来修改
- 通过三个八进制数修改
- chown修改所有者
- chgrp修改所属组
- umask修改或查看文件权限掩码
- 文件创建时的权限
- 目录的权限
- 粘滞位
- 总结
引言
我们知道,Linux中有两种用户:管理员用户root,以及普通用户。
管理员用户root可以在Linux下做任何事情,而普通用户只能做有限的事情,可以通过su指令来切换用户类型su user 与 su root(root可以省略):


(普通用户的命令提示符为$,root用户的命令提示符为#)
普通用户切换到root,需要输入root账号的密码。
对于Linux有这两种用户,也就是两种角色。那么对于一个文件或目录是否也对不同的用户有不同的权限呢,当然是有的,在本篇文章中就来介绍Linux文件的权限管理:
文件访问者的分类
对于一个文件或目录,在Linux中有三种角色:
- 文件的所有者:
u(user) - 文件所有者的所属组:
g(group) - 其他用户:
o(others)
所有者、所属组、其他用户只是单纯的角色,它其实并不能决定某个用户就一定对一个文件有某种权限。
用户对文件的权限不仅取决于这个用户对于这个文件的角色,还取决于文件的属性,即文件赋予角色什么权限。结合两者才能得知一个用户对于一个文件的权限。
文件类型与访问权限
我们在ll查看文件的属性的时候,展示出来许多文件的属性,其中就包括文件类型、对不同角色的访问权限、文件大小、最后一次修改时间、文件名等:

其中第一列为文件类型,后面的9列为访问权限,接下来的数字是链接数,接下来的两个名称分别为所有者与所属组,最后是最后一次修改时间与文件名:

文件类型
在Linux中,文件有如下几种类型:
d:文件夹-:普通文件l:软链接(类似Windows的快捷方式)b:块设备文件(例如硬盘、光驱等)p:管道文件c:字符设备文件(例如屏幕等串口设备)s:套接口文件
访问权限
用户对一个文件的权限有三种:可读、可写、可执行:
- 可读用
r表示(read):
有了可读权限,就可以读取文件的内容 - 可写用
w表示(write):
有了可写权限,就可以在文件中写入或删除内容 - 可执行用
x表示(execute):
有了可执行权限,就可以执行该文件 -表示没有某个权限
而上面文件的属性中描述权限的内容有9列,它们分别是对所有者的权限、对所属组的权限以及对其他用户的权限。其中对每个角色三种权限的描述分别为可读、可写、可执行,这些顺序都是固定的
所以如果对某个角色的某个权限的位置有相应的字符,就表示改角色有相应的权限,如果为-即表示该用户没有该权限:
例如这个testf文件:

前三列为对于所有者的权限,为r w -,表示该文件所有者对其可读可写,但是不可执行;
中间三列为所属组,为r w -,表示该文件所属组对其可读可写,但是不可执行;
后三列为其他用户,为r - -,表示其他用户对其可读,不可写不可执行
文件权限值的表示方法
对于三种权限有其固定的位置,当然可以通过二进制0与1的形式来表示一个角色对某文件的权限。
如此,一个文件对于角色权限就有2^3=8种不同的二进制数来表示:

修改权限的指令
chmod修改文件权限
使用chmod指令可以修改文件的权限,该操作只能由文件的所有者以及超级用户root执行(前面说过root用户无视权限)
通过角色+/-/=权限来修改
chmod [选项] 用户+/-/=某项权限 文件名
用这样的格式可以修改文件的权限。
其中,代表角色的符号为u(所有者)、g(所属组)、o(其他用户)、a(所有用户);
代表权限的符号为r(读权限)、w(写权限)、x(执行权限);
符号 +(向权限范围增加权限代号所表示的权限)、-(向权限范围取消权限代号所表示的权限)、=(向权限范围赋予权限代号所表示的权限):
给所属组g减去w权限

给所属组g直接赋予w权限

给其他用户o加上w权限

使用-R选项可以递归修改目录文件的权限

通过三个八进制数修改
chmod [选项] 三个八进制数 文件名
用于修改用户的权限
其中,第一个八进制数表示修改后的所有者权限,第二个表示修改后的所属组权限,第三个表示其他用户权限。
在前面,我们就已经用8个八进制数来表示所有的权限组合,所以这里直接使用即可:

同样的,使用-R选项可以递归处理。
chown修改所有者
chown [选项] 用户名 文件名
用于修改文件的所有者,只有root用户可以修改

-R选项可以递归处理目录下的文件:

chgrp修改所属组
chgrp [选项] 组名 文件名
用于更改文件的所属组用户,只能由root用户使用
我们可以先来创建一个组qqq,并创建一个用户temp,使qqq为其主用户组。然后来使用chgrp改变文件的所属组:
(可以通过groupadd [用户组名称](创建一个组qqq),与useradd -g [用户组名称] [新用户名称] (新建一个用户并使该组为主用户组)指令来实现)

-R选项可以实现目录的递归处理:

umask修改或查看文件权限掩码
umask 可以用于查看文件权限掩码
umask [三个八进制数] 用于修改文件权限掩码
在介绍这条指令的使用之前,我们先来了解一下文件权限掩码的作用:
文件创建时的权限
普通文件创建时的默认权限为0666,目录文件创建时的默认权限为0777。但是我们在新建一个新的文件或目录后,其权限却不是0666与0777:

新建一个文件的权限其实是默认的权限减去该用户的文件权限掩码(八进制),对于二进制的三位数而言,就是将用户的文件权限掩码按位取反后,再按位与(&)上默认权限。
普通用户默认的文件权限掩码为0002,root用户默认的文件权限掩码为0022
我们可以使用umask指令来查看:


对于上面的testf2文件与testdir2文件,其初始的权限就是 666 - 002 = 664(rw- rw- r--)与 777 - 002 = 775(rwx rwx r-x)。也可以通过二进制来计算。
使用umask [三个八进制数] 可以修改文件权限掩码:

将文件权限掩码改为0026后,新建的普通文件的权限就是 666 - 026 = 640(rw- r-- ---)。
目录的权限
对于目录:
- 可执行权限: 如果目录没有可执行权限, 则无法cd到目录中
- 可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容
- 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
我们可以来验证一下,我们之前创建了一个temp用户,这个文件夹对其他用户与所属组都是没有任何权限的:

这时,作为qiuzeyu账户,仅仅只能看见这个目录而已,其他什么都做不了:

我们依次打开temp对其他用户的权限(root操作):
只有x:(可以进入,不能查看与修改)

有x与r(可以进入,查看,不能修改)

有r w x(可以进入、查看、修改)

但是,这里有一个问题,就是只要用户有某目录的写权限,即使它没有这个目录中文件的写权限,那他也可以直接删除该目录中的文件(以temp下的tempdir目录演示):
当tempdir目录对其他用户有写权限时,就可以直接删除这个目录中的文件,无论对其中的文件是否有写权限:

这就很荒谬,属于是一个漏洞,都不能进行写入竟然可以直接删除这个文件。
使用粘滞位就可以解决这个问题:
粘滞位
粘滞位替代了其他用户的可执行权限的位置,用t表示。
可以使用chmod +t [文件名]的方式给目录添加粘滞位
使用粘滞位后,该目录中的文件只能由目录的所有者、目录中文件的所有者以及root账户删除:


总结
到此,关于Linux文件权限的内容就介绍完了
包括文件访问者的分类,文件类型与访问权限,文件权限值的表示方法,修改权限的指令,目录的权限与粘滞位
如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出
如果本文对你有帮助,希望一键三连哦
希望与大家共同进步哦



















