“t”字母在“ls -ld /tmp”的输出中代表什么?

运行命令ls -ld /tmp时,输出结果如下:
drwxrwxrwt 30 root root 20480 Mar 11 14:17 /tmp

所以我有两个主要问题:

  • 在权限后面的字母 t 是什么意思?
  • 据我所知,/tmp 用于创建与系统中不同用户相关的临时文件,那么为什么它有权限 rwxrwxrwx (777)?

对我来说这似乎是错误的。请帮助我理解这一情况。


11阅读Wikipedia文章,它比这里的回答要好得多。 - Gilles 'SO- stop being evil'
1另请参阅:http://unix.stackexchange.com/q/79395/4784 - Martin Thoma
好的,为什么当我从/tmp安装更新或新的rpm包时,粘滞位会被移除呢? - user325454
3个回答

那么什么是粘性位?

粘性位是设置在目录上的权限位,它只允许文件所属者、目录所有者或root用户删除或重命名该目录中的文件。其他用户没有足够的权限来删除其他用户创建的文件。

这是一种安全措施,用于防止关键文件夹及其内容(子目录和文件)被删除,尽管其他用户具有完全权限。

/tmp目录为什么有粘性位(t)?

/tmp目录可以被不同的Linux用户用来创建临时文件。那么,如果一个用户删除/重命名了该目录中其他用户创建的文件会怎样呢?

为了避免这些问题,使用了粘性位的概念。因此,给予了777权限,但保留粘性位并不是一个坏主意。

如何为目录设置粘性位?

我将在我的桌面上的一个名为test的目录上设置粘性位。

使用符号表示法(t代表粘性位):

chmod o+t ~/Desktop/test

或者

chmod +t ~/Desktop/test

使用八进制表示法(第一个位置的1代表粘性位):
chmod 1757 ~/Desktop/test

现在让我们来测试一下结果:
ls -li ~/Desktop/test

1551793 drwxrwxrwt 45 hadi hadi 20485 Mar 11 14:35 ~/Desktop/test

删除/移除粘性位
chmod o-t ~/Desktop/test

现在让我们来测试一下结果:
ls -li ~/Desktop/test

1551793 drwxrwxrwx 45 hadi hadi 20485 Mar 11 14:35 ~/Desktop/test

来源:“什么是粘性位,如何在Linux中设置?”来自The Linux Juggernaut


22这个粘滞位(sticky bit)的使用只适用于目录,而不是文件。在遥远的过去,它在可执行文件上的含义是将程序的文本段保存到交换空间,而不是丢弃它,以便再次运行时更快,但现在对常规文件没有任何意义。 - psusi
2程序的文本段是什么?保留它会使程序运行更快吗? - BluePython
3@BluePython 可执行文件的“text”段是包含所有机器代码的部分:实际的可执行位。常见的其他段有“data”用于静态数据,“bss”用于全零数据(因此不需要存储在可执行文件中)。 - Miles Rout
5目录权限中的't'和'T'有什么区别吗?@psusi - Afshin
12@Afshin:因为t隐藏了x,无法指示所有用户是否可以执行文件/目录,我们需要其他的指示方式。通常情况下,每个人都可以执行它,这种情况下你会得到一个普通的t(而不是x)。但如果不行,则会得到一个大写的T(而不是-)。来源:维基百科。 - Toby Bartels

粘性位是一种权限位,它被设置在文件或目录上,只允许文件/目录的所有者或root用户删除或重命名该文件。其他用户没有权限删除由其他用户创建的文件。
有时候你需要一个Linux目录,可以供Linux系统的所有用户用来创建文件。用户可以根据自己的方便性在这个目录中创建、删除或重命名文件。
那么,如果一个用户在这个目录中意外或故意删除(或重命名)其他用户创建的文件会怎样呢?
为了避免这种问题,使用了粘性位的概念。因为/tmp目录就是用于此目的。所以为了避免上述情况,/tmp目录使用了粘性位。
例如:
mkdir demo
chmod 777 demo

我还在这个文件夹中创建了两个具有不同用户权限的文件,权限设置为777。
ls -ld demo
drwxrwxrwx 2 guru guru 4096 Mar 11 18:17 demo

ls -l demo
-rwxrwxrwx 1 abhi abhi    0 Mar 11 17:11 file1
-rwxrwxrwx 1 anshu anshu   0 Mar 11 18:15 file2

现在在这个上面打开粘性位。
 chmod +t demo/
 ls -ld demo
 drwxrwxrwt 2 guru guru 4096 Mar 11 18:17 demo

现在如果一个用户(abhi)想要重命名第二个用户(anshu),会发生什么?
mv /home/guru/demo/file2  /home/guru/demo/file3
mv: cannot move '/home/guru/demo/file2' to  '/home/guru/demo/file3': Operation not   permitted  

粘性位的起源

在Linux上,粘性位只在目录上具有上述用途。从历史上看,在普通文件上它被用于完全不同的目的,这也是它名称的由来。

当一个程序被执行时,用户在实际开始使用之前需要将程序加载到内存中,这需要一定的时间。如果一个程序,比如编辑器,经常被用户使用,那么启动时间的延迟就成为了一个负担。

为了改善这种时间延迟,引入了粘性位。操作系统会检查可执行文件的粘性位是否打开,如果打开,则将可执行文件的文本段保留在交换空间中。这样,当再次运行该程序时,可以轻松地将可执行文件加载回RAM中,从而最小化时间延迟。

像Linux这样的现代系统会自动管理其可执行文件和其他文件的缓存,因此不需要粘性位来实现这个功能。

来源:“Linux Sticky Bit Concept Explained with Examples” at The Geek Stuff


粘性位是一种解决共享目录不会被意外删除的方法。当一个目录有粘性位时,只有所有者或root用户才能删除它,即使每个用户都可以拥有完全的其他权限。
/tmp是进程和用户之间最常用的共享目录,因此它包含了粘性位,以确保没有用户可以删除该目录,即使权限设置为777,这样做是为了给用户和进程使用该目录而不会产生权限冲突。