进一步了解Sticky Bit

本文深入探讨了UNIX文件系统中sticky位的历史背景及其在现代操作系统中的应用。sticky位最初是为了提高程序加载效率而设计,但现在主要用于限制特定目录下文件的删除权限。文章详细解释了在HP-UX和Solaris等系统中sticky位的不同作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      我们在的前一篇文章《深入了解 UNIX 文件权限》中提到过:当一个目录设置了 sticky bit ,该目录下的文件仅可以被文件所有者或目录所有者删除。这种机制是由 POSIX 规定的并被普遍推广。但是,上述功能并不是 sticky bit 最原始的目的。 POSIX ls 命令中给 sticky bit 是这样定义的:“限制删除功能开关”。在 C 语言头文件中代表 sticky bit 的常数是 S_ISVTX svtx 代表“ save text” 而这也正是提示了 sticky bit 的本来目的。
        POSIX 最初想法是:如果 sticky bit 设置了,进程中的“ text segment” 将会留在 swap 空间中;这样会使得它只需一次硬盘读就可以将其读入内存中。起初, UNIX 使用大小为 512 字节且趋于分散的块;因此需要一定的时间去收集那些分散的“ text segment” 并加载到内存中去。最早期的 UNIX 中没有页面调度,只有页面交换技术;因此要运行一个程序需要全部加载到内存中去;现在我们根据程序的需要加载数据页到内存中。这是不是说 sticky bit 的初始用途已经消失的呢?答案是否定的,根据不同的操作系统有不同的情况。
HP-UX 中, sticky bit 依然存在并可以在 HP-UX chmod(2) man page [1] 中查证。什么在用 sticky bit 呢?,通过 HP-UX FAQ [2] 中可以看到在 [The HP-UX Kernel Tuning and Performance Guide] 中有如下描述:

"When applications are located remotely, set the "sticky bit" on the applications binaries, using the chmod +t command. This tells the system to page the text to the local disk. Otherwise, it is "retrieved" across the network. Of course, this would only apply when there is actual paging occurring. More recently, there is a kernel parameter, page_text_to_local, which when set to 1, will tell the kernel to page all NFS executable text pages to local swap space."

Solaris 中虽然没有关于 sticky bit 初始用途的说明,但根据 Solaris chmod(2) man page [3] 可以看到如下描述 :

"If a regular file is not executable and has S_ISVTX set, the file is assumed to be a swap file. In this case, the system's page cache will not be used to hold the file's data. If the S_ISVTX bit is set on any other file, the results are unspecified."

     如果你发现一个文件设置了sticky bit,您就需要查看对应操作系统的chmod命令的man page看看有什么样的影响。另外请注意,如果有影响,OS会限制对root设置sticky bit。例如:在HP-UX,一个恶意的用户可以设置很多sticky bit让系统用完swap空间导致系统崩溃。

以下是不同OSchmod帮助手册中对sticky bit描述:

表一:不同OSsticky bit的描述

HP-UX实际上还有一些符号链接文件设置了sticky bit这将在以后的文章中继续讨论。



[1] 参考 HP-UX chmod 命令帮助手册 : http://docs.hp.com/en/B2355-90693/chmod.2.html
[2] 参考 HP-UX FAQ http://www.faqs.org/faqs/hp/hpux-faq/
[3] 参考 Solaris chmod 命令帮助手册 : http://docs.sun.com/app/docs/doc/816-5167/chmod-2?a=view
[4] 其它参考资料: www.wikipedia.org
A. http://nixdoc.net/man-pages/Linux/man1/chmod.1.html
B. http://nixdoc.net/man-pages/FreeBSD/man2/chmod.2.html
C. http://nixdoc.net/man-pages/IRIX/man2/standard/chmod.2.html
D. http://www.manpagez.com/man/2/chmod/
E. http://uw714doc.sco.com/en/man/html.2/chmod.2.html


<think>嗯,用户之前问了关于一个Android Init脚本的问题,其中涉及到chmod 0777的命令。现在他们又单独问“chmod 0777中的0代表什么”。我需要先确定用户是否了解chmod的基本概念,或者是否需要从头解释。 首先,用户可能已经知道chmod是用来修改文件权限的,但可能对八进制模式中的各个数字不太清楚。0777中的第一个0是特殊权限位,通常被称为setuid、setgid和sticky bit。但用户可能没有意识到这一点,或者可能认为0只是权限数字的一部分,而没有特殊含义。 接下来,我需要分步骤解释。首先,回顾chmod的八进制表示法。三个数字分别代表用户、组和其他人的权限。每个数字是0到7之间的值,由读(4)、写(2)、执行(1)相加而来。例如,7=4+2+1,代表读、写、执行权限。 然后,解释第一个0。这个0代表特殊权限位,通常放在三位权限数字的前面。在八进制中,这个位置可以设置setuid、setgid和sticky bit。例如,4755中的4是setuid位,2775中的2是setgid位,1777中的1是sticky bit。如果这个位置是0,意味着不设置任何特殊权限。 用户可能混淆了四位数字和三位数字的情况。当使用四位数字时,第一位是特殊权限,而当使用三位时,默认第一位是0。所以0777等同于777,但显式地写出0可能为了明确不设置特殊权限。 还要注意,用户可能是在看到之前的例子后,对0产生疑问。在之前的例子中,使用0777可能是为了强调没有特殊权限,但用户可能不明白这一点。需要指出在大多数情况下,三位数字就足够了,四位数字中的0可以省略,但显式写出有时是为了代码的可读性或避免误解。 最后,强调安全性的问题。0777赋予所有用户完全权限,可能存在安全风险,特别是在生产环境中。结合用户之前的例子,修改/proc下的调试接口权限,需要提醒谨慎使用,避免不必要的权限开放。 总结用户的真实需求,他们可能是在学习Linux文件权限时遇到了困惑,或者在实际脚本中看到这样的用法,想要深入理解每个部分的含义。需要以清晰的结构,分点解释,确保用户能够理解每个数字的作用,并意识到潜在的安全问题。</think>`chmod 0777` 中的 **首个数字 0** 代表 **特殊权限位**(Special Mode Bits),用于设置文件的特殊权限。这是 Linux/Unix 文件权限系统中的高级控制部分,具体解析如下: --- ### 1️⃣ **八进制权限的完整结构** 完整的权限表达式为 **四位八进制数**(如 `0777`): ``` 0 7 7 7 │ │ │ └── 其他用户权限(others) │ │ └────── 所属组权限(group) │ └────────── 所有者权限(user) └────────────── 特殊权限位(special mode bits) ``` --- ### 2️⃣ **首位的 0 具体含义** 当首位为 `0` 时,表示 **不启用任何特殊权限**。特殊权限位由三个二进制位构成: - **第1位**:`setuid`(设置用户ID) - **第2位**:`setgid`(设置组ID) - **第3位**:`sticky bit`(粘滞位) | 八进制值 | 二进制 | 含义 | |----------|--------|-----------------------------| | 0 | 000 | 关闭所有特殊权限 | | 4 | 100 | 启用 `setuid` | | 2 | 010 | 启用 `setgid` | | 1 | 001 | 启用 `sticky bit` | --- ### 3️⃣ **示例对比** | 命令 | 等效权限 | 说明 | |----------------|---------------------|-----------------------------| | `chmod 0777` | `rwxrwxrwx` | 完全开放权限,无特殊权限 | | `chmod 4777` | `rwsrwxrwx` | 启用 `setuid` | | `chmod 2777` | `rwxrwsrwx` | 启用 `setgid` | | `chmod 1777` | `rwxrwxrwt` | 启用 `sticky bit` | --- ### 4️⃣ **为什么常被省略?** - **常规场景**:大多数情况下只需设置基础权限(后三位数字),因此 `chmod 777` 等价于 `chmod 0777` - **显式写法**:明确写出 `0` 是为了强调不设置特殊权限(尤其在脚本中增强可读性) --- ### 5️⃣ **安全警告** ```bash # 开放 0777 权限的风险(任何人可修改/删除): chmod 0777 /path/to/file # 相当于允许所有用户完全控制 ``` **建议替代方案**: ```bash # 更安全的权限设置(所有者完全控制,其他人只读): chmod 0644 /path/to/file # 等价于 -rw-r--r-- ``` --- 若需进一步了解 `setuid`/`setgid`/`sticky bit` 的具体作用,可告知需要深入讲解哪个特殊权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值