前言
为什么是文件的权限?因为:
Linux一切皆文件
查看文件权限
通过ls --help
可以看到l
参数的意思是使用长列表格式
使用如下命令,以长列表格式查看根目录有哪些文件
ls -l /
输出比较多,咱这边拿
etc
目录来做一个例子
drwxr-xr-x. 77 root root 8192 Mar 30 2019 etc
咱们对输出的内容先做一个拆分,一个个来解释说明,这里总共拆分成12段内容
d
rwx
r-x
r-x
.
77
root
root
8192
Mar 30
2019
etc
第一段:文件类型
-
表示普通文件
d
表示目录
l
表示链接文件
p
表示管道文件
b
表示块设备文件
(一般在/dev
目录下 )c
表示字符设备文件
(一般在/dev
目录下 )s
表示套接字文件
由此可以看出,我们的
etc
是一个目录类型的文件
shell 默认文件类型颜色
前提是使用
系统缺省
的配色方案
灰白色
表示普通文件
亮绿色
表示可执行文件
亮红色
表示压缩文件
灰蓝色
表示目录
亮蓝色
表示链接文件
(文件名称后面会有-> <路径>
)亮黄色
表示设备文件
第二、三、四段:UGO权限
从左往右依次为 (所属用户权限)U
(所属组权限)G
(其他用户权限)O
(所属用户和所属组和第七段,第八段有关)
r
读取权限- 针对文件:可以查看文件内容
- 针对目录:可以查看目录下有哪些文件和目录
w
写入权限- 针对文件:可以修改、删除、移动
- 针对目录:可以删除、移动
x
执行权限- 针对文件:具有执行权限
- 针对目录:具有进入目录的权限
-
无权限举例:
r-x
:表示具有读取和执行权限,没有写入权限rw-
:表示具有读取和写入权限,没有执行权限
特殊权限
SUID
:仅适用于二进制可执行文件
,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失- 所属用户权限的
x
权限位置显示为s
- 所属用户权限的
SGID
:既可以对文件进行配置,也可以对目录进行配置。默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录- 所属组权限的
x
权限位置显示为s
- 所属组权限的
SBIT
:权限仅对目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root 才有权利修改或删除该文件- 其他用户权限的
x
权限位置显示为t
- 其他用户权限的
UMASK 默认权限
执行umask
命令可以看到root
用户默认的值是0022
,普通用户默认的值是0002
第一个数字用来表示
SUID
、SGID
、SBIT
第二个数字用来表示所属用户
U
第三个数字用来表示所属组
G
第四个数字用来表示其他用户
O
以数字的形式代替 rwx 权限
r
:4w
:2x
:1SUID
:4SGID
:2SBIT
:1
文件和目录创建时的默认权限
计算公式:文件或目录的最高权限 - UMASK默认值 = 文件或目录创建时的默认权限出于安全考虑,文件的最高权限为
666
,也就是rw-rw-rw-
,默认都不提供执行权限目录的最高权限为
777
,也就是rwxrwxrwx
计算UMASK创建默认权限,一般只看最后三位数字(除了特殊需求)
文件创建时默认权限
666 - 022 = 644
- 因此 root 用户创建的文件,默认权限为
rw-r--r--
- 因此 root 用户创建的文件,默认权限为
666 - 002 = 664
- 因此普通用户创建的文件,默认权限为
rw-rw-r--
- 因此普通用户创建的文件,默认权限为
目录创建时默认权限
777 - 022 = 755
- 因此 root 用户创建的目录,默认权限为
rwx-r-x-r-x
- 因此 root 用户创建的目录,默认权限为
777 - 002 = 775
- 因此普通用户创建的目录,默认权限为
rwxrwxr-x
- 因此普通用户创建的目录,默认权限为
权限控制 之 chmod 命令
权限控制 之 chown 命令
权限控制 之 chgrp 命令
参考文档:
隐藏权限 chattr 命令
常用命令参数
A
:即 Atime,告诉系统不要修改对这个文件的最后访问时间。S
:即 Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。a
:即 Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。b
:不更新文件或目录的最后存取时间。c
:将文件或目录压缩后存放。d
:当dump程序执行时,该文件或目录不会被dump备份。D
:检查压缩文件中的错误。i
:即 Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。s
:彻底删除文件,不可恢复,因为是从磁盘上删除,然后用0填充文件所在区域。u
:当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件,用来防止意外删除文件或目录。t
:文件系统支持尾部合并(tail-merging)。X
:可以直接访问压缩文件的内容。R
:递归修改指定目录下的子目录和文件+
:在原有参数设定基础上,追加参数。-
:在原有参数设定基础上,移除参数。=
:更新为指定参数设定。
chattr 命令的用法先生成一个有内容的文件
echo 'hello world' > text.txt
只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件,不允许删除这个文件
chattr +a text.txt
查看隐藏权限
lsattr text.txt
-----a---------- text.txt
追加内容到 text.txt 文件
echo 'test' >> text.txt
删除 text.txt 文件
rm -f text.txt
rm: cannot remove ‘text.txt’: Operation not permitted
此时就会返回如下信息,不能删除解除隐藏权限
此时再去删除文件,文件就可以被删除了
chattr -a text.txt
参考文档:
第五段:SELINUX 和 ACL 权限
.
:表示有 SELINUX 安全上下文,没有 ACL 权限- SELINUX 开启时创建的安全上下文,在 SELINUX 被关闭后依然存在,不会被删除
- SELINUX 被关闭后创建的文件或目录,不再显示
.
+
:表示有 ACL 权限,至于有没有 SELINUX 安全上下文,需要使用ls -Z
命令查看了
参考文档:
第六段:链接数
对于目录文件,表示它的第一级子目录的个数。注意此处看到的值要减2才等于该目录下的子目录的实际个数。
比如这里的include目录下,其实是没有子目录的,所以应该是0,但是它这里却显示2,这是因为要加上.目录和..目录。在linux下,.目录表示当前目录,..目录表示上一级目录。
这也可以解释上图中第一行的.目录下的3和第二行..目录下的26。因为当前目录下有一个include目录,所以加上.目录和..目录这2个目录就等于3,所以第一行会显示3。而上一级目录共有24个目录,加上上一级目录的.目录和..目录这2个目录,所以这里的第二行显示的是26。
对于其他文件,表示指向它的链接文件的个数。