文件权限理解
在linux系统中,无论是设备,队列,还是内存,一切都被视为文件,由于linux系统是基于多人分时使用的,因此,权限分离是必不可少的一部分。
基本权限
进入linux任一目录后,输入指令
ls -l
得到以下输出
total 40
-rw-r--r-- 1 achilles staff 26 1 19 23:52 README.md
-rw-r--r-- 1 achilles staff 190 1 19 23:52 clickhouse-jdbc.iml
-rw-r--r-- 1 achilles staff 190 2 20 16:03 job-pending-kill.iml
drwxr-xr-x 6 achilles staff 192 4 14 21:07 kill-gain-sum
drwxr-xr-x 7 achilles staff 224 4 28 21:44 kill-job
lrwxr-xr-x 1 achilles staff 9 4 28 21:45 kill-jobp -> kill-job/
-rw-r--r-- 1 achilles staff 6076 2 20 16:04 pom.xml
第一列所示即为文件的基础属性,主要可以分为四段。
第一段为文件类型,第二段为文件拥有者权限(u
),第三段为文件拥有者所在组的权限(g
),第四段为其他人的权限(o
)。
第三列和第四列分别表示文件拥有者及文件拥有者所在组。
其中,文件类型主要有如下几种
d 目录
- 普通文件或硬链接(ln不带其他参数默认创建硬链接)
l 软链接(一般使用ln -s创建)(删除软链接时注意不要删除目录/)
r w x分别表示读,写,可执行权限,可以用chmod, chgrp等命令改变
chmod u+rwx pom.xml
chmod u=rwx pom.xml
chmod 744 pom.xml
# 744代表以八进制对应表示ugo的权限,r为4,w为2,x为1,对应位权限相加即可
权限判断的执行顺序是,首先判断执行用户是否是文件拥有者,若是,则具有文件拥有者的属性(u
),如不是,则判断执行用户是否属于文件拥有者所在组,若是,则具有文件拥有者所在组的权限(g
),如不是,则具有其他人权限(o
)。
对于文件来说,拥r
权限,代表可以读取文件,拥有w
权限,代表可以写入文件,拥有x
权限,代表可以执行文件
对于目录来说,拥有r
权限,代表可以使用ls
读取目录详细信息,拥有w
权限,代表可以修改目录下的结构即在该目录下创建文件,拥有x
权限,代表可以打开目录
使用者能够进入某目录成为可工作目录需要的基本权限
- 对目录有
x
权限,进入目录 - 对目录有
r
权限,ls读取详细信息
使用者能够在某个目录内读取一个文件需要的基本权限
- 对目录有
x
权限,进入目录 - 对文件有
r
权限,读取文件
使用者修改一个文件需要的基本权限
- 对目录有
x
权限,进入目录 - 对文件有
r
权限,读取文件 - 对文件有
w
权限,修改文件
使用者创建一个文件需要的基本权限
- 对目录有
x
权限,进入目录 - 对目录有
w
权限,修改目录结构
注意:若用户对目录具有w
权限,即使其对目录内的文件不具有w
权限,他也能删除目录内的文件
默认权限
不同用户创建的文件可能具有不同的初始权限,这就涉及到默认权限umask
。
umask
0022
这个0022代表的含义是什么呢?(第一个0先忽略,后面会提到,此处认为是022)
对于文件来说,一般的最大需要权限为666(一般不需要执行),对于目录来说,一般的最大权限为777(因为需要x权限进入目录)
那么创建文件时,实际的默认权限为022 XOR 666 = 000 010 010 XOR 110 110 110 = 110 100 100 = 644
我们创建一个文件验证一下
touch test && ls -l test
-rw-r--r-- 1 achilles staff 0 4 29 11:08 test
可以看到,符合预期。
目录的默认权限也类似文件的计算方法。
注意,不同的用户具有不同的默认权限,可以用umask改变。
如
umask 002
隐藏属性
上面部分主要讲了文件的基本权限。如果用户拥有对文件的w
权限,那么用户就一定能够修改文件吗?
答案是不一定!因为文件还存在隐藏属性!
使用如下指令可以查看文件的隐藏属性
注意:
lsattr
-------------e-- ./test
下面列出一些常见的隐藏属性
A :当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改,可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S :一般文件是非同步写入磁盘的,如果加上 S 这个属性时, 当你进行任何文件的修改,该更动会“同步”写入磁盘中。
a :当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性
c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
d :当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份
i :这个 i 可就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!” 对于系统安全性有相当大的助益!只有 root 能设置此属性
s :当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!
u :与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来救援该文件喔!
e :表示是ext文件系统来存储的,不能使用chattr -e来去掉
注意1:属性设置常见的是 a 与 i 的设置值,而且很多设置值必须要身为 root 才能设置
注意2:xfs 文件系统仅支持 AadiS 而已
可以使用chattr
指令配合上面的参数来修改文件的隐藏属性,如
chattr +i test
# 表示改文件不能被删除,也不能被修改了
特殊权限
还有一类特殊权限,SUID
, SGID
, SBIT
。
SUID
如果文件拥有者设置了SUID
权限,且文件使用者具有对文件的x
权限,那么文件使用者在执行时将以文件拥有者的身份执行。即 set UID。
比如/etc/shadow
这个文件的权限为
---------- 1 root root 1287 Apr 25 19:02 /etc/shadow
即只有root用户有权限修改这个文件,可是普通用户实际上是可以使用passwd
指令修改自己的密码
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 27856 Aug 9 2019 /usr/bin/passwd
我们可以看到,/usr/bin/passwd
指令属于root用户,root用户组,文件创建者root拥有的权限和之前讲的基本权限不同,为rws
,这个s
权限即为SUID
权限,其他用户对其具有x
权限。所以其他用户在执行/usr/bin/passwd
指令时,会暂时具有文件拥有者root的权限,从而修改/etc/shadow
。
注意:SUID
仅能对文件设置,不能对目录设置。
SGID
当s
标志在文件拥有者所在群组的x
标志位,而不在文件拥有者的x
标志位时,称为SGID
。即set GID。
对文件来说,如果文件设置了SGID
权限,且文件使用者具有对文件的x
权限,那么文件使用者在执行时将以文件拥有者所在组的身份执行。
对目录来说,如果目录设置了SGID
权限,且使用者具有对文件的r
与x
权限,那么使用者能够进入此目录,使用者在此目录下的有效组将会变成该目录的组。此外,若使用者在此目录下具有w
权限(可以新建文件),则使用者创建的新文件具有与目录一样的组。
SBIT
用t
标志表示,且一般标在o
的x
权限处。sticky BIT。
如:
drwxrwxrwt
SBIT
仅对目录有效,它表示,当使用者对目录具有w
, x
权限时,即使用者具有写入的权限,若此时目录设置了SBIT
,则表示使用者在该目录下创建文件或目录时,仅有自己和root才可以删除对应的文件或目录。
特殊权限其他
最后,前面提到过文件权限修改一般为3位八进制数字,涉及特殊权限时则为4位八进制数字(如0022
,第一个0
表示特殊权限,可以简化为022
)
- 4 表示
SUID
- 2 表示
SGID
- 1 表示
SBIT
如:
touch test && chmod 6070 test && ls -l test
---Srws--- 1 root root 0 Apr 29 11:43 test
详细解释一下6070
。第一位6
表示文件有SUID
,SGID
权限,第二位0
表示文件拥有者不具有rwx
权限,第三位7
表示文件所属组具有rwx
权限,第四位0
表示其他用户不具有rwx
权限,这样看来权限应为---srws---
,那么实际的权限中大写的S
表示什么意思呢?
如果具有对文件的x
权限,则使用SUID/SGID
替换x
时,使用小写的s
。
如果不具有对文件的x
权限,则使用SUID/SGID
替换x
时,使用大写的S
。
这样定义后,整个文件权限体系就逻辑清楚,成为一个完整的体系了。