文件权限
1. 权限与归属
1.1 文件类型
尽管在 Linux 系统中一切都是文件,但是每个文件的类型不尽相同,因此 Linux 系统使用了不同的字符来加以区分,常见的字符如下:
字符 | 解释 |
---|---|
- | 文件 |
d | 目录 |
l | 链接 |
p | 管道文件 |
b | 块设备 |
c | 字符型设备 |
n | 网络设备 |
1.2 权限表示
在 Linux 系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r) 、可写(w) 、可执行(x) 等权限。
文件的读、写、执行权限可以简写为rwx,亦可用数字 4、2、1 来表示。文件所有者、所属组及其他用户权限之间并无关系,如下:
通过
ls
命令查即可在文件的属性中看到权限信息(如果没有某种权限,该权限位用连字符-
来表示):文件权限的数字法表示基于字符表示
rwx
的权限计算而来,其目的是简化权限的表示。规则如下:
文件权限的含义:
- 对于一般文件——权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。
- 对于目录文件——“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;“可执行”则表示能够进入该目录。
其实,文件能否被删除并不取决于自身的权限,而取决于其所在目录是否有写入权限。
1.3 默认文件权限
当创建文件时,它天然即自带了一个权限设置,即默认文件权限,比如:
$ touch newfile
$ ls -al newfile
-rw-r--r-- 1 rich rich 0 Sep 20 19:16 newfile
$
通过umask
命令可以显示和设置上述默认权限,如:
$ umask
0022
$
umask
的第一位代表了一项特别的安全特性,叫作粘着位(sticky bit),后面的3位表示文件或目录对应的八进制值。
......后面一坨介绍没看懂,再议吧...
1.4 修改权限
chmod
chmod
命令用来改变文件/目录的安全性设置,其语法为:chmod <option> mode file
。
其中,mode参数可以使用八进制模式/符号模式来进行安全性设置:
八进制模式:
$ chmod 760 newfile $ ls -l newfile -rwxrw---- 1 rich rich 0 Sep 20 19:16 newfile $
符号模式:符号模式下指定权限的格式为
[ugoa…][[+-=][rwxXstugo…]
第一部分 第二部分 第三部分 u
代表用户现在基础上增加权限( +
)通常的rwx g
代表组现有基础上移除权限( -
)X:如果对象是目录或者它已有执行权限,赋予执行权限 o
代表其他将权限设置成后面的值( =
)s:运行时重新设置UID或GID a
代表上述所有t:保留文件或目录 u:将权限设置为跟属主一样 g:将权限设置为跟属组一样 o:将权限设置为跟其他用户一样 $ chmod o+r newfile $ ls -lF newfile -rwxrw-r-- 1 rich rich 0 Sep 20 19:16 newfile* $
chown/chgrp
chown
命令用来改变文件的属主,chown
命令的格式为:chown <option> owner<.group> file
可用登录名或UID来指定文件的新属主
$ chown dan newfile $ ls -l newfile -rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile $
chown
命令也支持同时改变文件的属主和属组$ chown dan.shared newfile $ ls -l newfile -rw-rw-r-- 1 dan shared 0 Sep 20 19:16 newfile $
如果你不嫌麻烦,可以只改变一个目录的默认属组
$ chown .rich newfile $ ls -l newfile -rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile $
最如果你的Linux系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者
$ chown test. newfile $ ls -l newfile -rw-rw-r-- 1 test test 0 Sep 20 19:16 newfile $
option | 作用 |
---|---|
-R | 配合通配符可以递归地改变子目录和文件的所属关系 |
-h | 选项可以改变该文件的所有符号链接文件的所属关系 |
chgrp
用来改变文件的默认属组:
$ chgrp shared newfile
$ ls -l newfile
-rw-rw-r-- 1 rich shared 0 Sep 20 19:16 newfile
$
用户账户必须是这个文件的属主,除了能够更换属组之外,还得是新组的成员。现在shared组的任意一个成员都可以写这个文件了。
2. 特殊权限与隐藏权限
单纯设置文件的 rwx 权限无法满足我们对安全和灵活性的需求,因此有了设置用户 ID(SUID)、设置组 ID(SGID)、粘着位(SBIT)的特殊权限。
相关八进制值:
SUID
SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息定稿到 shadow 文件中。这是一种有条件的、临时的特殊权限授权方法,类似于皇帝授予了钦差大臣尚方宝剑。此时查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限;若原本的权限是 rw-,则变为 rwS.
SGID
主要实现两种功能:
- 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)
- 在某个目录中创建的文件自动继承目录的用户组(只可以对目录进行设置)
SBIT
当目录被设置为 SBIT 特殊权限位后,文件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原本无 x 执行权限则会被写成 T。
隐藏权限
Linux 中的文件还有一种隐藏权限,默认情况下不能直接被用户发觉。
隐藏权限相关命令:
chattr
:设置文件的隐藏权限,chattr <option> file
如果要把某个隐藏功能添加到文件上,在命令后面追加
+
参数;如果要把某个隐藏功能移出文件,则追加-
参数。option function i
无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 a
仅允许补充内容,无法伤病/删除内容(Append Only) S
文件内容在变更后立即同步到硬盘(sync) s
彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域) A
不再修改这个文件或目录的最后访问时间(atime) b
不再修改文件或目录的存取时间 D
检查压缩文件中的错误 d
使用 dump 命令备份时忽略本文件/目录 c
默认将文件或目录进行压缩 u
当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 t
让文件系统支持尾部合并(tail-merging) X
可以直接访问压缩文件中的内容 lsattr
:显示文件的隐藏权限,lsattr <option> file
平常用的
ls
之类的命令看不出隐藏权限
3. 访问控制列表
访问控制列表(ACL),通常来讲,基于普通文件或目录设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限。
如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。
ACL 相关命令:
setfacl
:管理文件的 ACL 规则,setfacl <option> file
参数 作用 -R
针对目录文件需要使用 -R
递归参数-m
针对普通文件使用 -m
参数-b
删除某个文件的 ACL 常用的
ls
命令是看不到 ACL 表信息的,但是却可以看到文件的权限最后一个点(.
)变成了加号(+
),这就意味着该文件已经设置了 ACL 了getfacl
:显示文件上设置的 ACL 信息,getfacl file