> For the complete documentation index, see [llms.txt](https://slackwarecn.gitbook.io/slackbook_cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://slackwarecn.gitbook.io/slackbook_cn/chapter_10/suid_sgid_and_the_sticky_bit.md).

# 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
```
