粘性位如何工作?


148

SUID

应用于可执行程序的粘性位,用于标记系统,以在程序完成运行后将程序的映像保留在内存中。

但是我不知道它存储在内存中。以及在这种情况下如何看到它们?


这是一个很好的教程,其中包含有效的示例和说明。理解这一点的关键是所涉及的八进制系统。Linux粘性位教程及其实例
CMP

Answers:


193

这可能是我一直困扰着我的最讨厌的事情之一。SUID / GUID位和粘性位是2个完全不同的东西。

如果您这样做man chmod,则可以阅读有关SUID和粘性位的信息。该手册页可在这里为好。

背景

摘抄

字母rwxXst为受影响的用户选择文件模式位:读(r),写(w),执行(或搜索目录)(x),仅当文件是目录或已经对某些文件具有执行权限时才执行/搜索用户(X),在执行时设置用户或组ID,限制删除标志或 粘性位(t)

SUID / GUID

上面的手册页试图说的是,x位在用户八进制(rwx的第一组)和八进制组(rwx的第二组)的rwxrwxrwx中所处的位置可以处于x变为一个 发生这种情况时,该文件在执行时(如果它是一个程序,而不仅仅是一个shell脚本)将在所有者或文件组的许可下运行。

因此,如果该文件归root用户所有,并且SUID位已打开,则该程序将作为root用户运行。即使您以普通用户身份执行它。同样的情况也适用于GUID位。

摘抄

SETUID和SETGID位

如果文件的组ID与用户的有效组ID或用户的补充组ID之一不匹配,则chmod将清除常规文件的set-group-ID位,除非用户具有适当的特权。其他限制可能导致MODE或RFILE的set-user-ID和set-group-ID位被忽略。此行为取决于基础chmod系统调用的策略和功能。如有疑问,请检查基础系统行为。

除非您另外明确指定,否则chmod会保留目录的set-user-ID和set-group-ID位。您可以使用u + s和gs等符号模式设置或清除位,也可以使用数字模式设置(但不清除)位。

SUID / GUID示例

没有suid / guid-只设置了rwxr-xr-x位。

$ ls -lt b.pl
-rwxr-xr-x 1 root root 179 Jan  9 01:01 b.pl

suid和用户的可执行位已启用(小写s) -设置了rwsr-xrx位。

$ chmod u+s b.pl 
$ ls -lt b.pl 
-rwsr-xr-x 1 root root 179 Jan  9 01:01 b.pl

启用suid并禁用可执行位(大写S) -设置rwSr-xr-x位。

$ chmod u-x b.pl
$ ls -lt b.pl 
-rwSr-xr-x 1 root root 179 Jan  9 01:01 b.pl

启用guid&group的可执行位(小写s) -设置了rwxr-sr-x位。

$ chmod g+s b.pl
$  ls -lt b.pl 
-rwxr-sr-x 1 root root 179 Jan  9 01:01 b.pl

启用guid和禁用可执行位(大写S) -设置了rwxr-Sr-x位。

$ chmod g-x b.pl
$  ls -lt b.pl 
-rwxr-Sr-x 1 root root 179 Jan  9 01:01 b.pl

粘性位

另一方面,粘性位表示为t,例如/tmp目录:

$ ls -l /|grep tmp
drwxrwxrwt. 168 root root 28672 Jun 14 08:36 tmp

鉴于其真正含义,应该始终将此位称为“受限删除位”。启用此模式位后,它将创建一个目录,以便用户只能删除其所有者的文件和目录。

摘抄

限位标记或粘滞位

受限删除标志或粘性位是单个位,其解释取决于文件类型。对于目录,
除非特权用户拥有文件或目录,否则它可以防止特权用户删除或重命名目录中的文件。这称为目录的受限删除标志,通常在世界可写目录(例如/ tmp)中找到。对于某些较旧系统上的常规文件,该位将程序的文本图像保存在交换设备上,以便在运行时更快地加载;这就是所谓的粘性位。


43
实际上,粘性位以前可以应用于可执行文件,这导致它们在首次加载后仍保持交换状态。这样可以为大量使用的程序节省大量不必要的磁盘/网络(NFS)和CPU使用率。但是,Linux或大多数(所有?)Unix系统都不再支持此功能(它已从内核中删除)。这是“粘性”的,因为可执行文件卡在交换中。另外,它还用于您描述的目录。
Baard Kopperud 2013年

4
实际上,“用得最多或很大”将是一个更好的描述。还记得我的大学在1995年将Netscape Web浏览器“粘”在其HP-UX计算机上。所以经常使用的小型程序(例如cron频繁运行的系统命令)和大型程序(例如Netscape)是“粘性”的主要候选人。在这两种情况下,不断从磁盘/ NFS重新加载它们将是浪费的。
2013年6

8
粘性位程序旨在驻留在RAM中,而不是交换位置(从交换文件加载图像并不比从文件系统磁盘加载图像快得多)。它旨在用于基本的OS级命令,例如ls。显然,只有超级用户才能在文件上设置粘性位。引入虚拟内存和共享库后,它变得不那么重要了,尤其是随着传呼机变得更加智能并可以动态决定保留哪些页面时,传呼机变得尤为重要。
Alexis

4
而且由于sticky属性对目录没有意义,因此稍后解释了权限掩码的相同位以修改目录的传统文件创建语义。
Alexis

5
@alexis:最初,粘性位程序保留在交换空间中。这比从文件系统读取要快得多,因为读取交换文件图像是连续的扇区,因此大多数情况下可以异步读取。对于早期的文件系统,没有扇区“运行长度”,并且大多数早期的文件系统驱动程序一次读取一个扇区,即使这些扇区碰巧是连续的。在PDP-40上的结果是粘性程序似乎立即加载,而非粘性程序通常需要一到两秒钟。我认为我们只有ed粘性。
wallyk

8

“用于执行程序的粘性位标记系统,以在程序完成运行后将程序的映像保留在内存中。”

我认为这是非常过时的信息,今天大多数现代Unix都忽略了这一点。在Linux中,粘性位仅与目录有关。请参阅此处和内容丰富的Wikipedia文章

无论如何,在旧的行为中,映像(仅“代码”而不是数据)仅保留在虚拟内存中-通常被交换,而不是在真实内存中,以便在下一次运行时更快。


3

什么是粘性位?

粘性位是在目录上设置的权限位,该权限位仅允许该目录中文件的所有者或root用户删除或重命名该文件。没有其他用户具有删除其他用户创建的文件所需的特权。

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


1
AB

7
@AB对我来说似乎很准确,几乎可以解释您引用的Wikpedia文章的开头。它出什么问题了?
roaima 2015年

我会说答案是不完整的。“ Sticky”还表示可执行文件将保留在交换空间中,以使其更快地运行。现在,这是古老的历史,但是在较旧的文件系统中,驱动程序一次只能读取一个扇区,即使这些扇区碰巧是连续的。这使得非粘性可执行文件变慢,而粘性在当时具有很大的意义。
GhostCode
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.