理解Linux目录权限的原因

17

您好,我有两个关于Linux目录权限的问题不太明白。

我从名为“Documents”的文件夹中删除了可执行权限。此后,我无法在其中使用cd命令,但我仍然可以从父目录中使用“ls Documents”命令,并且它仍然会列出文档目录中的文件。 我认为缺少x标志会拒绝读取此目录?

接下来我想知道为什么要在目录上设置粘滞位。我听说它被用于使用户不能删除其他用户创建的临时文件。但是这违反了对于删除文件我们只需要在该目录中具有相应权限的规则。为什么不简单地为每个用户提供单独的/tmp/目录,而要在规则系统中引入例外呢? 我知道这个标志的作用,但我想知道为什么要发明它的原因。

4个回答

16

执行位:需要执行位才能遍历目录。对目录的读取权限由读取位控制。

以下是此差异的示例:

以 root 身份运行:

# find foo/ -ls
drwxr-xr--   3 root     root         4096 Apr 27 12:57 foo/
drwxr-xr-x   2 root     root         4096 Apr 27 12:57 foo/bar
-rw-r--r--   1 root     root            0 Apr 27 12:57 foo/bar/file

以用户身份运行:

$ ls foo/
bar
$ find foo/ -ls
drwxr-xr--   3 root     root         4096 Apr 27 12:57 foo/
find: foo/: Permission denied
$

通常的用法则相反:移除读取权限,但允许遍历,例如通过设置 --x 来允许网页服务器进入 ~/public_html,但不允许它进行默认索引列表。

粘着位:这是专门为了避免在目录中删除文件的默认规则而发明的,从而使得 /tmp 起作用。 /tmp 可能位于与 /home 不同的卷上和/或受到不同配额的控制。

FHS 规范化了 /tmp,其中“用于需要临时文件的程序”,而“[他们]不能假设 /tmp 中的任何文件或目录在调用之间被保留”。

就个人而言,我认为/tmp是从异教时代遗留下来的,当时vi globals.h && make install被认为是一种安装程序。现在的程序应该尊重$TMPDIR,它应该指向一个由系统管理的用户私有目录,在重启时应该至少清除一次。即使像tmpfile(3)这样的标准函数也没有规定实际路径。虽然似乎有重要的与兼容性和安全性有关的问题需要考虑使用/tmp。请注意,最后一封邮件是1999年的,所以事情可能已经发生了改变。


X位:但如果我仍然可以在没有X位的情况下读取目录中的文件,为什么我需要它?哪个操作会强制我实际进入这个目录?S位:当然,但是您可以为每个用户在/tmp/目录中创建子目录。也许还要创建硬链接,如/home/otto/tmp/ -> /tmp/otto/,但即使没有这些,它仍将正常工作。 - codymanix
我改进了答案,希望能够解决您评论中提到的问题。 - David Schmitt
它可能禁止实际“更改”目录,但我仍然可以做以前能做的一切,那么它实际上有什么好处呢?我仍然可以执行“ls foo /”和“ls foo / bar”,甚至“cat foo / bar / file”仍然可以正常工作。我还可以删除其中的文件。在您看来,穿越和阅读之间有什么区别?如果我可以列出目录及其子目录中的所有文件,则理论上可以在其中搜索文件。那么为什么“find”不起作用? - codymanix
find 命令无法正常工作,因为它(可能)试图切换到 foo/ 目录,而这是不允许的。 - David Schmitt
并不是我希望得到的答案,但也许没有人知道他们在开发这个操作系统时为什么做出了这个决定。无论如何,非常感谢。我将其标记为已解决。 - codymanix

5

我偶然发现这篇文章,因为它在谷歌搜索中排名很高。关于“执行位”问题还没有得到真正的回答,所以...

如果一个目录上没有设置“执行位”,那么它就不能被遍历,这意味着 shell 和文件浏览器应该被设计成不允许你将该目录设置为当前目录,虽然该功能不能由文件系统本身强制执行。文件系统对于一个没有“执行位”的目录所禁止的是除了包含文件的文件名之外的任何信息,所以即使这些文件已经设置了读取权限,也无法读取这些文件的日期戳或文件权限等信息。


3

粘滞位

如今,粘滞位最常用于目录中。当设置了粘滞位后,目录内的文件只能被文件所有者、目录所有者或超级用户重命名或删除;如果没有设置粘滞位,则具有该目录写和执行权限的任何用户都可以重命名或删除其中的文件,而不管文件所有者是谁。通常,在/tmp目录上设置此功能,以防止普通用户删除或移动其他用户的文件。该功能于1986年在4.3BSD中引入,如今几乎在所有现代Unix系统中都可以找到。

此外,Solaris(从Solaris 2.5开始)在非可执行文件上设置粘滞位时定义了特殊行为:当访问这些文件时,内核不会将其缓存。这通常在交换文件上设置,以防止对文件的访问从系统缓存中刷新更重要的数据。它也偶尔用于基准测试。

自动挂载程序还会设置粘滞位,以指示文件尚未挂载。这允许诸如ls之类的程序忽略未挂载的远程文件。


就像我说的,我已经知道它有什么好处,但我想知道为什么他们使用了我提出的另一种/更干净的解决方案。在我看来,粘滞位只是一个混乱目录结构的解决方法。 - codymanix
它被称为“遗留行为”,它防止了那些假定 /tmp 是可用的脚本出现故障。 - Jonathan Leffler

0

对于 CD,目录应该是 0555 模式,文件是 0444。 可以将 Unix 群组视为角色。 你的角色是你的附加群组。 如果你不是所有者,那么控制是强制性的。 如果你是所有者,则是自由裁量的。 只有当你拥有每个路径元素的 eXecute/search 权限时,才能遍历该路径。这与易受目录遍历攻击的 Microsoft Windows 不同。 它的发明是为了实现“DoD 可信计算机系统评估标准”中的“彩虹系列”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接