chmod命令4位权限数字的含义

平时授予文件权限都是使用 chmod 777 这样的命令来实现,最近看到了一种 chmod 0777 的写法,效果和 chmod 777 没什么差别,但是这一位又是合法的,很好奇多出来的第一位是什么作用,经过查询 new Bing 和文档,发现原来权限的标志位并不仅仅是只有 rwx 那么简单。

类似于后面的 777,每个 7 都代表了转换为二进制 111 后对应 rwx 位的开关状态,上面第一位 0 也是代表了 3 个标志位的开关状态,分别是 set user ID (4)、set group ID (2)、sticky (1),0 说明都没有设置,7 说明全部开启。之所以后面表示用户、用户组和其他人权限用了 3 个数字,而这里只用 1 个数字是因为读、写、执行是需要针对用户、用户组、其他用户分别设置,而第一位是针对所有人设置的。

SUID

setuid 作用是当用户执行的时候,进程以所有者的 UID 运行,这样可以避免用户有当前文件的执行权限,但是没有执行过程中相关文件的权限,导致执行失败。比如修改密码的 passwd 命令,执行时需要修改系统文件,但是这个命令是所有人都可以执行的,那么没有修改系统文件权限的人也要能修改密码,所以 passwd 文件设置了 setuid 标志位,虽然修改密码的用户没有权限,但是 passwd 执行时是以文件所有者 root 权限执行的。

setuid 权限是体现在用户的执行权限位上的,平时显示 x 的标志位显示为 s,如果文件的所属用户没有执行权限,则显示为大写的 S

1
2
3
4
5
6
7
8
9
10
11
12
# 4 对应下面的 s,755 对应 rwxr-xr-x
root: stat -c "%a %U:%G %n" /usr/bin/passwd
4755 root:root /usr/bin/passwd

root: ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59976 Nov 24 12:05 /usr/bin/passwd

# 删除所属用户的执行权限,s 变为 S
root: chmod u-x /usr/bin/passwd

root: ls -l /usr/bin/passwd
-rwSr-xr-x 1 root root 59976 Nov 24 12:05 /usr/bin/passwd

SGID

setgid 的作用是,如果是作用于文件夹,则用户在该文件夹下创建的文件或目录的所属用户组继承该文件夹的所属用户组。如果是作用于文件,类似 setuid,文件执行时所属用户组不是执行用户的用户组,而是文件的所属用户组。使用场景是多个用户各自有各自的用户组,同时有属于一个组织的用户组,组织的工作空间可以通过设置 setgid 标志位来让用户共享工作空间中的内容,否则用户在工作空间下创建的内容都会默认为用户所属的用户组。

setgid 权限是体现在用户组的执行权限位上的,平时显示 x 的标志位显示为 s,如果文件的所属用户组没有执行权限,则显示为大写的 S

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# user1 属于 user1 和 organization 两个用户组
user1: groups user1
user1 : user1 organization

# organization 目录设置了 setgid 标志位
user1: stat -c "%a %U:%G %n" ./organization/
2770 root:organization ./organization/

user1: ls -l
drwxrws--- 2 root organization 4096 Apr 20 08:23 organization/

user1: mkdir ./organization/doc

# 在 organization 文件夹下创建的内容所属用户组为 organization
user1: stat -c "%U:%G %n" ./organization/doc
user1:organization ./organization/doc

user1: touch ./organization/text.txt

user1: stat -c "%U:%G %n" ./organization/text.txt
user1:organization ./organization/text.txt

# 在未设置 setgid 标志位的文件夹下创建的内容用户组为 user1
user1: touch ~/text.txt

user1: stat -c "%U:%G %n" ~/text.txt
user1:user1 ~/text.txt

Sticky bit

sticky 标志位一般设置在目录上,设置了该标志位,目录中的内容只有 root 和所有者可以删除或移动,比如 /tmp 目录是所有用户放置临时文件的目录,所有人对目录都有写和执行权限,但是不能删除或移动其他用户的文件。

sticky 权限是体现在其他用户的执行权限位上的,平时显示 x 的标志位显示为 t,如果文件的其他用户没有执行权限,则显示为大写的 T

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# /tmp 目录设置有 sticky 标志位
user1: stat -c "%a %U:%G %n" /tmp
1777 root:root /tmp

# 其他用户的执行标志位显示为 t
user1: ll / | grep tmp
drwxrwxrwt 11 root root 4096 Apr 20 08:59 tmp/

user1: ll /tmp
-rw-rw-rw- 1 root root 4 Apr 20 08:59 test

# 可以编辑、执行 /tmp 目录下其他用户的文件,但是不能移动、删除
user1: mv /tmp/test /tmp/test1
mv: cannot move '/tmp/test' to '/tmp/test1': Operation not permitted

以上,就是 chmod 命令中多出来的第一位的含义了。

分享