我们知道,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
指令可以修改文件的权限,该操作只能由文件的所有者以及超级用户root执行(前面说过root用户无视权限)
chmod [选项] 用户+/-/=某项权限 文件名
用这样的格式可以修改文件的权限。
其中,代表角色的符号为u
(所有者)、g
(所属组)、o
(其他用户)、a
(所有用户);
代表权限的符号为r
(读权限)、w
(写权限)、x
(执行权限);
符号 +
(向权限范围增加权限代号所表示的权限)、-
(向权限范围取消权限代号所表示的权限)、=
(向权限范围赋予权限代号所表示的权限):
给所属组g
减去w
权限
给所属组g
直接赋予w
权限
给其他用户o
加上w
权限
chmod [选项] 三个八进制数 文件名
用于修改用户的权限
其中,第一个八进制数表示修改后的所有者权限,第二个表示修改后的所属组权限,第三个表示其他用户权限。
在前面,我们就已经用8个八进制数来表示所有的权限组合,所以这里直接使用即可:
同样的,使用-R
选项可以递归处理。
chown [选项] 用户名 文件名
用于修改文件的所有者,只有root用户可以修改
-R
选项可以递归处理目录下的文件:
chgrp [选项] 组名 文件名
用于更改文件的所属组用户,只能由root用户使用
我们可以先来创建一个组qqq,并创建一个用户temp,使qqq为其主用户组。然后来使用chgrp
改变文件的所属组:
(可以通过groupadd [用户组名称]
(创建一个组qqq),与useradd -g [用户组名称] [新用户名称]
(新建一个用户并使该组为主用户组)指令来实现)
-R
选项可以实现目录的递归处理:
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-- ---
)。
对于目录:
我们可以来验证一下,我们之前创建了一个temp用户,这个文件夹对其他用户与所属组都是没有任何权限的:
这时,作为qiuzeyu账户,仅仅只能看见这个目录而已,其他什么都做不了:
我们依次打开temp对其他用户的权限(root操作):
只有x
:(可以进入,不能查看与修改)
有x
与r
(可以进入,查看,不能修改)
有r
w
x
(可以进入、查看、修改)
但是,这里有一个问题,就是只要用户有某目录的写权限,即使它没有这个目录中文件的写权限,那他也可以直接删除该目录中的文件(以temp下的tempdir
目录演示):
当tempdir目录对其他用户有写权限时,就可以直接删除这个目录中的文件,无论对其中的文件是否有写权限:
这就很荒谬,属于是一个漏洞,都不能进行写入竟然可以直接删除这个文件。
使用粘滞位就可以解决这个问题:
粘滞位替代了其他用户的可执行权限的位置,用t
表示。
可以使用chmod +t [文件名]
的方式给目录添加粘滞位
使用粘滞位后,该目录中的文件只能由目录的所有者、目录中文件的所有者以及root账户删除:
到此,关于Linux文件权限的内容就介绍完了
包括文件访问者的分类,文件类型与访问权限,文件权限值的表示方法,修改权限的指令,目录的权限与粘滞位
如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出
如果本文对你有帮助,希望一键三连哦
希望与大家共同进步哦