在 Linux 系统中,目录的 sticky 权限(sticky bit)是一种特殊的权限设置,主要用于控制目录内文件的删除或重命名权限。它的核心特点是:即使目录对所有用户开放了写权限,也只有特定用户(文件所有者、目录所有者或 root)才能删除或重命名目录中的文件。

定义与作用

粘滞位(Sticky Bit) 是一种目录级权限,用 t 表示。

核心作用:保护目录中的文件不被任意用户删除,即使这些用户对目录有写权限。

典型场景:多用户共享的临时目录(如 /tmp),用户可以在其中创建文件,但无法删除他人的文件。

与普通目录权限的对比

假设目录权限为 drwxrwxrwt(sticky 位启用):

普通目录权限(如 drwxrwxrwx):

若用户对目录有写权限(w),则可以删除或重命名目录中的任何文件(即使文件不属于该用户)。

启用 sticky 位的目录(drwxrwxrwt):

即使用户对目录有写权限,只有以下用户可以删除或重命名文件:

文件的所有者 目录的所有者 root 用户

如何设置/取消 sticky 位

设置 sticky 位:
chmod +t 目录名
# 或通过八进制模式(1000 是 sticky 位的值)
chmod 1777 目录名
取消 sticky 位:
chmod -t 目录名
# 或通过八进制模式
chmod 0777 目录名

典型示例

场景:共享临时目录 /tmp

默认权限:

ls -ld /tmp
# 输出:drwxrwxrwt  root root  ...

效果:

用户 A 在 /tmp 中创建文件 file_a

用户 B 无法删除 file_a,即使对 /tmp 有写权限。

只有用户 A、root 或 /tmp 的所有者(root)可以删除 file_a。

注意事项

仅对目录有效:

sticky 位对文件无效(文件的 t 权限无实际意义)。

不影响文件内容修改:

用户仍可以修改自己拥有的文件内容(如写入数据),但不能删除或重命名文件。

与 ACL 的区别:

sticky 位是粗粒度的权限控制,而 ACL(访问控制列表)可实现更细粒度的权限管理。

查看 sticky 位

使用 ls -ld 命令查看目录权限:

ls -ld /tmp
# 输出:drwxrwxrwt  root root  ...
# 最后一位 `t` 表示 sticky 位已启用

常见问题

Q1:为什么 /tmp 需要 sticky 位? A:防止用户误删或恶意删除他人的临时文件,同时允许所有人在目录中创建文件。

Q2:如果忘记设置 sticky 位会怎样? A:例如,若 /tmp 的权限为 drwxrwxrwx,任何用户都可以删除他人的临时文件,导致安全隐患。

Q3:sticky 位和 chattr +i(不可修改属性)有何区别? A:

sticky 位:仅限制删除/重命名操作,不影响文件内容修改。 chattr +i:完全锁定文件(禁止删除、修改、重命名等),需 root 权限设置。 总结 目录的 sticky 权限(t)是一种保护机制,确保多用户环境下共享目录的安全性。它在需要临时文件共存但不允许随意删除的场景(如 /tmp)中至关重要。使用时需注意其作用范围(仅目录)和权限设置的合理性。