# SUID、SGID 和粘滞位

权限还有一部分尚未涉及，它们就是三种特殊权限，分别是 SUID，SGID 和粘滞位。只要一个文件有这三种的其中之一，它就会有一定的特殊之处。SUID 和 SGID 影响程序运行的方式，粘滞位限制该文件的删除。这些权限也能像读写执行一样用 `chmod` 设定，但稍有不同。

SUID 和 SGID 分别表示“Set User ID”和“Set Group ID”。当程序文件设置了二者之一的权限时，程序运行起来后将拥有它所有者或所属组的权限，无论执行程序的是谁。让我们来看看一个 SUID 的例子—— `passwd` 和它管理的文件：

```
darkstar:~# ls -l /usr/bin/passwd \
  /etc/passwd \
  /etc/shadow
-rw-r--r-- 1 root root    1106 2008-06-03 22:23 /etc/passwd
-rw-r----- 1 root shadow   627 2008-06-03 22:22 /etc/shadow
-rws--x--x 1 root root   34844 2008-03-24 16:11 /usr/bin/passwd*
```

注意 `passwd` 的权限，它没有 `x` 权限而是一个 `s` 权限。这代表着，`passwd` 是一个 SUID 程序，当运行它的时候，它将拥有其所有者 `root` 的权限，无论执行者是谁。只要你看看它管理的文件你就知道为什么要这么做了：`/etc/passwd` 和 `/etc/shadow` 都是除了 `root` 外不可写入的。而用户需要修改各自的信息，因此 `passwd` 必须以 `root` 身份运行来修改这些文件。

那么粘滞位又是什么意思呢？它限制某个文件的移动和删除，并且只能设置在目录上。非 `root` 用户无法移动或删除设置了粘滞位的目录下的文件，除非该用户是目标文件的所有者。基本上所有人只要有了写权限都能移动或删除文件，粘滞位限制除了其所有者（当然还有 `root`）进行这些操作。让我们看看一个“粘滞”目录的例子：

```
darkstar:~# ls -ld /tmp
drwxrwxrwt 1 root root   34844 2008-03-24 16:11 /tmp
```

作为整个系统的临时文件存放地，`/tmp` 自然要对所有人开放读写执行权限。由于每个人都有可能在某个时间段在此存放了文件，那么为什么要禁止其他用户删除就很好理解了。你能在全局权限部分的 `x` 位置看见它，不过不是 `x` 而是 `t` 。

| 权限类型 | 八进制表示 | 字母表示 |
| ---- | ----- | ---- |
| SUID | `4`   | `s`  |
| SGID | `2`   | `s`  |
| 粘滞   | `1`   | `t`  |

> 表 10.5；SUID，SGID 和粘滞权限

使用八进制设置的时候，必须在最前方加一位来表示。比如，`/tmp` 对应的就是 `1777`，`/usr/bin/passwd` 的权限就是 `4711` 。基本上这一位都不怎么用，`chmod` 自动填充 `0` 。

```
darkstar:~# chmod 1777 /tmp
darkstar:~# chmod 4711 /usr/bin/passwd
```

字母表示稍有不同。假设这两个文件权限都是 `0000`（没有任何权限），我们应该这样设置：

```
darkstar:~# chmod ug+rwx,o+rwt /tmp
darkstar:~# chmod u+rws,go+x /usr/bin/passwd
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://slackwarecn.gitbook.io/slackbook_cn/chapter_10/suid_sgid_and_the_sticky_bit.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
