粘性位如何工作?

lot*_*ous 160 filesystems permissions

SUID

粘着位应用到可执行程序标记系统,以保持节目的图像在内存中后,该程序运行完毕。

但我不知道它在内存中存储了什么。在这种情况下,我如何才能看到它们。?

slm*_*slm 215

这可能是我最讨厌的事情之一,人们总是搞砸。SUID/GUID 位和粘滞位是两个完全不同的东西。

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

背景

摘抄

字母rwxXst为受影响的用户选择文件模式位:读取(r)、写入(w)、执行(或搜索目录)(x)、仅当文件是目录或已经对某些文件具有执行权限时才执行/搜索用户 (X),在执行 (s) 时设置用户或组 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

粘点

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

$ ls -l /|grep tmp
drwxrwxrwt. 168 root root 28672 Jun 14 08:36 tmp
Run Code Online (Sandbox Code Playgroud)

考虑到它的真正含义,这个位应该一直被称为“受限删除位”。启用此模式位后,它会创建一个目录,以便用户只能删除其中属于他们的文件和目录。

摘抄

受限删除标志或粘滞位

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

  • 实际上,粘滞位以前可以应用于可执行文件,这导致它们在首次加载后仍处于交换状态。这可以为经常使用的程序节省大量不必要的磁盘/网络 (NFS) 和 CPU 使用率。然而,无论是 Linux 还是大多数(所有?)Unix 系统都不再支持这个(它已从内核中删除)。它是“粘性的”,因为可执行文件卡在交换中。此外,它用于您描述的目录。 (50认同)
  • 粘滞位程序旨在驻留在 RAM 中,而不是在交换中(从交换文件加载图像并不比从文件系统磁盘加载快多少)。它旨在用于基本的操作系统级命令,如 `ls`。显然,只有超级用户才能在文件上设置粘滞位。在引入虚拟内存和共享库之后,它变得不那么重要了,尤其是当分页器变得更智能并且可以动态地决定哪些页面要驻留时。 (10认同)
  • @alexis:最初,粘性位程序保存在交换空间中。这比从文件系统读取要快得多,因为读取交换文件图像是连续的扇区,因此可以大部分异步读取。对于早期的文件系统,没有扇区“运行长度”,大多数早期的文件系统驱动程序一次读取一个扇区,即使这些扇区碰巧是连续的。PDP-40 的结果是粘性程序似乎可以立即加载,而非粘性程序通常需要一两秒钟。我认为我们只有 `ed` 粘性。 (5认同)
  • 实际上“经常使用或非常大”会是一个更好的描述。记得 1995 年,我的大学在他们的 HP-UX 计算机上使用 Netscape 网络浏览器作为“粘性”。所以经常使用的小程序(例如,cron 经常运行的系统命令)和大程序(例如 Netscape)是成为“粘性”的主要候选人。在这两种情况下,不断从磁盘/NFS 重新加载它们都是浪费。 (4认同)
  • 由于粘性属性对目录没有意义,权限掩码的相同位_稍后_被解释为修改目录的传统文件创建语义。 (4认同)
  • @alexis:将程序保存在 RAM 中会非常奢侈,但早期系统只有 64 或 128 K。通常的系统调整是最小化内核大小,因为 64 K 减去内核大小是为了提供 8 到 10 个磁盘缓冲区(514每个字节),其余的 RAM 用于一次一个程序驻留。 (2认同)

leo*_*loy 8

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

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

无论如何,在那个旧行为中,图像(只有“代码”,而不是数据)只保存在虚拟内存中 - 通常交换,而不是在真实内存中,以便下次运行得更快。