关于 Unix 权限的 13 个问题

文件权限是多少位(bits)?

12位

分为 4 个组,每组 3 位。

例如,4755 对应的是 100 111 101 101

下面是各部分对应的内容:

1
2
3
4
100: setuid, setgid, sticky bits
111: user r/w/x bits
101: group r/w/x bits
101: other r/w/x bits

当我们运行 ls -l 时,显示的权限是 -rwxr-xr-x,这里的 r、w 和 x 是什么意思?

读、写、执行

每个文件有 3 套 读/写/执行 权限:

  • 拥有该文件的用户
  • 拥有该文件的组
  • 其他用户

如果一个文件的权限是 0644,拥有该文件的组是否能写这个文件?

不能

0644 在二进制中是 000 110 100 100

说明如下:

1
2
3
4
000
110 拥有该文件的用户可以读写此文件
100 拥有该文件的组可以读此文件
100 其他用户可以读此文件

所以任何人都可以读取该文件,但只有拥有该文件的用户才可以写文件。

操作系统内核是否关心你的用户名是什么?

不关心

内核基于 用户ID/组ID 进行所有的权限检查 —— 用户名和组名的存在只是为了让人类更容易识别和使用。

如果一个目录被设置为可读权限,这意味着什么?

意味着你可以列出该目录中的文件

对于目录来说,下面是读/写/执行的含义:

  • 读:你可以列出文件
  • 写:你可以创建文件
  • 执行:你可以进入该目录并访问其下的文件

如果一个文件的权限被设置为 0666,这是否意味着任何人都可以阅读它?

不一定

如果该文件的父目录的执行位被置为 0,这将使你无法读取该目录下的任何文件。

如果一个文件的权限被设置为 0000,这是否意味着没有人可以读它?

不是

root 可以读写权限为 0000 的文件。

每个进程都有一个用户ID(UID)吗?

是的

当你以用户身份登录时,几乎你启动的所有进程都会把它们的 UID 设置为你的 UID。

一个进程可以有多个组ID(GID)吗?

是的

进程有一个主 GID,也有一个补充(supplementary)组ID列表。文件权限检查将检查进程的任何一个组ID是否与文件的所有者匹配。

如果你把一个用户添加到一个组,以该用户身份运行的现有进程是否会自动将该 GID 添加到他们的 GID 列表中?

不会

退出并重新登陆后才会生效。

setuid 位的作用是什么?

在一个可执行文件上,它意味着该进程将以文件所有者的 UID 运行

例如,passwd(用来修改密码)通常设置了setuid位,因为它需要以 root 身份运行,以便能够写入修改密码的文件。

一个没有特权的进程有可能改变其 UID 吗?

不可能

你必须有超级用户的权限来改变你的 UID。

为什么 sudo 可以让你以 root 身份运行命令?

它设置了 setuid 位

sudo 总是以 root 身份运行。

所以如果 /etc/sudoers 允许你以 root 身份启动程序,则它将以 root 身份为你启动程序。