我试图理解为什么 sudo 在这里没有权限
touch fred.txt
/tmp$ ls -la fred.txt
-rw-rw-r-- 1 me me 0 Dec 12 15:40 fred.txt
/tmp$ sudo -i
~# cd /tmp
/tmp# echo hi >> fred.txt
-bash: fred.txt: Permission denied
/tmp# chmod 666 fred.txt
/tmp# ls -la fred.txt
-rw-rw-rw- 1 me me 0 Dec 12 15:40 fred.txt
/tmp# echo hi >> fred.txt
-bash: fred.txt: Permission denied
id
uid=0(root) gid=0(root) groups=0(root)
据我了解,权限 666 应授予所有者、组和其他对文件进行 r/w 的权限。如 id 命令所证明的,作为 root 的 Surly sudo 可以在“其他”权限下访问该文件。
我在这里有什么误解?
它与Linux 内核中的这个提交有关。通常
/tmp
是“world-writable”(“world”这里的意思是“others”)并且是“sticky”的:chmod(2)
:正如提交消息中所提到的,它并不能完全阻止您写入受影响的文件,而是阻止您使用 . 打开这样的文件,如果目标尚不存在
O_CREAT
,该标志通常设置为触发文件创建。open()
因此,您仍然可以在未设置标志的情况下写入受影响的文件(可以使用 完成dd
):请注意,这纯粹是关于是否设置了标志,而不是是否需要创建文件,因为在关注的情况下,文件总是存在的。
另请注意,正如提交消息中所述,无法打开该文件不仅是
O_CREAT
因为它不属于试图打开它的用户 (root
),而且还因为它的所有者 (tom
) 与所有者 (root
) 不同目录 (/tmp
)。如果/tmp/
按tom
原样拥有/tmp/meh
,root
则可以使用O_CREAT
.另请参阅systemd 中的此提交,它启用了对采用它的发行版的“保护”:
请注意,相关的 sysctls也可以设置
2
(或0
)。