HOWTO · Linux
Linux 中 Sticky Bit 的用途
本教程演示了粘滞位在 Linux 中的用途。
本页内容
在 Linux 中,共享可写目录上的粘滞位会限制谁可以删除或重命名其中的条目。使用 chmod +t 设置,用 ls -ld 检查目录权限,再用 chmod -t 移除。
粘滞位的作用
在 Linux 中,粘滞位主要用于多个用户都可以写入的目录,例如 /tmp。它会限制谁可以删除或重命名该目录中的条目:条目所有者、目录所有者或具有特权的进程可以执行这些操作。只要目录和文件权限允许,粘滞位不会阻止其他用户读取或以其他方式访问文件。
粘滞位与目录的常规权限共同生效。例如,共享目录可以允许用户创建条目,同时阻止某个用户删除其他用户创建的条目。在现代 Linux 中,普通文件上的粘滞位并非本指南介绍的用法;本指南只讨论目录。
在目录上设置粘滞位
在要更改权限的目录上使用 chmod +t。将 /shared 替换为你要管理的目录的准确路径。该命令会更改该目录的权限模式,因此请先确认路径正确,并确认自己有权更改它。
运行以下示例:
本节中的代码以及显示的标签或输出仍为英文。
directory=$(mktemp -d)
trap 'rmdir "$directory"' EXIT
chmod +t "$directory"
chmod a+rwx "$directory"
stat -c '%A' "$directory"
drwxrwxrwt
权限字符串会以 t 结尾,表示粘滞位和相应的执行权限均已设置。本节中的代码及显示的标签或输出保持英文。这个单用户示例只展示权限标记,并未演示多个用户之间的删除行为。示例先设置粘滞位,再运行 chmod a+rwx 让临时目录对所有人可写,因此目录不会在没有粘滞位限制的情况下对所有人开放写入。对于现有共享目录,可直接运行 chmod +t /shared;该命令会保留其他权限位。示例会创建一个临时目录,以便演示权限变化,而不修改系统目录或共享目录。
检查粘滞位
使用 ls -ld /shared 检查目录本身(请替换为你更改过的路径)。如果已设置粘滞位,且目录的其他用户执行权限已开启,权限字符串的最后一个字符就是 t,例如 drwxrwxrwt。如果已设置粘滞位,但该执行权限未开启,最后一个字符则是大写 T。这个标记反映的是权限模式;它不能说明不同用户实际能否访问该目录或其中的条目。
移除粘滞位
要移除该设置,请运行 chmod -t /shared,并将示例路径替换为目标目录的路径。然后再次运行 ls -ld /shared。末尾不应再出现小写 t 或大写 T。目录的其他权限位会保持原样,因此移除粘滞位不会自动让目录变为可写,也不会改变谁能访问其中的文件。
常见问题
如何检查是否已设置? 使用 ls -ld 加上目录路径,并检查权限字符串的最后一个字符。t 或 T 表示粘滞位已设置;大小写取决于其他用户执行权限是否开启。
为什么要在共享可写目录中使用它? 粘滞位会阻止普通用户删除或重命名他人所有的条目,同时允许目录所有者和具有特权的进程管理这些条目。因此,/tmp 等共享目录通常会设置粘滞位。
它会阻止对文件的其他访问吗? 不会。粘滞位限制的是在该目录中删除和重命名条目。读取、写入和遍历访问仍取决于相关目录和文件的权限。
可以在普通文件上设置吗?如何撤销? 本教程介绍的是粘滞位在现代 Linux 目录上的实用行为;在普通文件上设置它并非本教程演示的用法。要从目录中移除它,请运行 chmod -t /path/to/directory,然后使用 ls -ld 检查权限模式。