3. 权限管理
3.1. 文件描述符
ls -l
命令输出的第 1 个字段就是描述文件和目录权限的编码。
drwxrwxr-x 13 fong fong 4096 5月 7 10:33 source/
第一个字符代表对象的类型:
-:普通文件
d:目录
l:链接
c:字符型设备文件
b:块设备文件
n:网络设备文件
之后是 3 组三字符的编码,每一组定义了 3 种访问权限(若没有某种权限,使用 - 代替):
r:可读
w:可写
x:可执行
ls -F
会在可执行文件的文件名后加一个 *
,目录后方加 /
。
3 组权限对应对象的 3 个安全等级:
对象的属主(登录名 fong)
对象的属组(组名 fong)
系统其它用户
第 2 个字段是文件链接数,第 3 个字段是属主,第 4 个字段是属组,第 5 个字段是占用存储大小,第 6 个字段是最后修改时间。
Note
除了 r
w
x
,还会见到 s
t
,分别表示 SetUid/SetGid、粘滞位。
3.2. 粘滞位
1$ ll / | grep tmp
2drwxrwxrwt 1 root root 4.0K 2022-11-20 22:16:34 tmp/
3$ ll /var | grep tmp
4drwxrwxrwt 2 root root 4.0K 2022-08-27 01:43:44 tmp/
上面两个存放临时文件的系统目录的权限最后一位是 t
,这是粘滞位。当目录被设置了粘滞位以后,即使用户对该目录有写权限,也不能删除该目录中其他用户的文件,只有文件的拥有者和 root 用户才可以删除。这就达到了各个用户可以在同一目录中读、写、修改、删除文件,但是不能随意删除其他用户文件的目的。
设置粘滞位:
chmod +t <dir>
Note
如果权限最后一位是 T
,说明该目录没有可执行权限,应执行: chmod +x <dir>
。
3.3. 默认文件权限
umask
查看默认文件权限, unask -S
打印符号化的权限:
1$ umask
20002
3$ umask -S
4u=rwx,g=rwx,o=rx
5## 临时修改默认权限 (若要长期生效,把 umask 0022 写进 ~/.bashrc)
6$ umask 0022
7$ umask
80022
9$ umask -S
10u=rwx,g=rx,o=rx
第 1 位用于 SetUid(对应 4 )或 SetGid(对应 2 )或粘着位(Sticky Bit,对应 1),后 3 位表示文件或目录对应的 umask 八进制值,分别对应 3 组权限。
权限 |
二进制值 |
八进制值 |
---|---|---|
- - - |
000 |
0 |
- - x |
001 |
1 |
- w - |
010 |
2 |
- w x |
011 |
3 |
r - - |
100 |
4 |
r - x |
101 |
5 |
r w - |
110 |
6 |
r w x |
111 |
7 |
umask 值只是 掩码 ,屏蔽不想授予的权限,即:真正的权限是用 全权限 值减去 umask 值(逻辑与运算)。 文件的默认全权限值是 666 ,目录的全权限值是 777 。当 umask=0022,新建文件默认权限是 644,新建目录默认权限是 755。
1$ which passwd
2/usr/bin/passwd
3$ ll /usr/bin/passwd
4-rwsr-xr-x 1 root root 63K 2022-03-14 16:26:09 /usr/bin/passwd*
passwd
这个指令的属主权限里面有个 s
,说明这个文件设置了 SetUid,作用是:拥有该文件的执行权限的任意用户,在执行该文件的时候,都是以该文件的属主(root)的权限来执行的。因为用户密码需要写入 /etc/shadow ,而普通用户是没有权限直接写这个文件的。
Attention
基于安全考虑,很多操作系统会忽视对 Shell 脚本进行 SetUid 的操作,执行脚本的时候不会赋予期望的权限。
Note
修改文件或目录的属主、属组使用命令 chown
,需要 root 权限。
3.4. 改变权限
chmod [-cfvR] [--help] [--version] [mode] [file...]
参数:
- -c
若该文件权限确实已经更改,才打印更改动作
- -f
若该文件权限无法被更改,也不打印错误讯息
- -v
打印权限变更的详细动作
- -R
对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
mode:
[ugoa] [+-=] [rwxXst]
u 表示对象的属主,g 表示对象的属组成员,o 表示系统其它用户,a 表示所有用户。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读,w 表示可写,x 表示可执行。
1$ mkdir test
2$ ls -l
3drwxr-xr-x 2 fong fong 4096 5月 7 13:34 test/
4$ chmod -v 777 test
5mode of 'test' changed from 0755 (rwxr-xr-x) to 0777 (rwxrwxrwx)
6$ chmod -v a-w test
7mode of 'test' changed from 0777 (rwxrwxrwx) to 0555 (r-xr-xr-x)
3.5. 参考资料
chmod(1) — Linux manual page
chown(2) — Linux manual page
How Do I Set Up Setuid, Setgid, and Sticky Bits on Linux?
umask leading 0
Shell 命令运行原理和权限详解