Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Linux目录权限推理_Linux_Unix_Permissions_Directory - Fatal编程技术网

理解Linux目录权限推理

理解Linux目录权限推理,linux,unix,permissions,directory,Linux,Unix,Permissions,Directory,嗨,我有两个关于linux目录权限的问题,我不明白 我从名为Documents的文件夹中删除了execute标志。之后,我不能在它上面使用cd,但我仍然可以从父目录中执行“ls Documents”,并且它仍然会在Documents目录中列出文件。 我认为丢失的x标志否认读取此目录 然后我想知道为什么目录上的粘性部分被发明了。我听说它的使用是为了用户不能删除其他用户创建的临时文件。但是这个IMO违反了删除文件的规则,我们只需要这个目录的权限。为什么不简单地给每个用户一个单独的/tmp/目录,而不

嗨,我有两个关于linux目录权限的问题,我不明白

我从名为Documents的文件夹中删除了execute标志。之后,我不能在它上面使用cd,但我仍然可以从父目录中执行“ls Documents”,并且它仍然会在Documents目录中列出文件。 我认为丢失的x标志否认读取此目录

然后我想知道为什么目录上的粘性部分被发明了。我听说它的使用是为了用户不能删除其他用户创建的临时文件。但是这个IMO违反了删除文件的规则,我们只需要这个目录的权限。为什么不简单地给每个用户一个单独的/tmp/目录,而不是在规则系统中引入异常?
我知道标志的作用,但我想知道发明is的原因。

执行位:需要执行位来遍历一个目录。读取目录的权限由读取位控制

有关此差异的示例,请参见此shell对话:

根目录:

# 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 #查找foo/-ls drwxr xr--3根根目录4096 Apr 27 12:57 foo/ drwxr-xr-x 2根根目录4096年4月27日12:57 foo/bar -rw-r--r--1根根目录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 $ $ls foo/ 酒吧 $find foo/-ls drwxr xr--3根根目录4096 Apr 27 12:57 foo/ 查找:foo/:权限被拒绝 $ 通常的用法是相反的:删除读取权限但允许遍历,例如允许web服务器进入~/public\u html,但不允许它通过设置
--x
来执行默认索引列表

粘性位:这是为了避免在目录中删除的默认规则而发明的,因此
/tmp
可以工作
/tmp
可能位于与
/home
不同的卷上和/或受不同配额的控制

“适用于需要临时文件的程序”,而“[它们]不得假定/tmp中的任何文件或目录在调用之间被保留”

我个人认为,TMP是来自异教徒时代的遗产,当代码> VI Guulals.H&&安装安装> /COD>被认为是安装程序。现在的程序应该遵守
$TMPDIR
,它应该指向用户私有系统管理的目录,至少在重新启动时应该清除该目录。甚至像这样的标准化功能也没有规定实际的路径。虽然这似乎很重要。不过请注意,最后一封邮件是1999年的,因此从那以后情况可能会有所变化。

如今,粘性位最常见的用途是在目录上,设置后,目录中的项目只能由项目所有者、目录所有者或超级用户重命名或删除;如果不设置粘性位,任何对目录具有写入和执行权限的用户都可以重命名或删除包含的文件,而不考虑所有者。通常在/tmp目录上设置此选项,以防止普通用户删除或移动其他用户的文件。此功能于1986年在4.3BSD中引入,现在在大多数现代Unix系统中都可以找到它

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


粘滞位也由automounter设置,以指示文件尚未装入。这使得像ls这样的程序可以忽略未安装的远程文件。

只是偶然发现了这一点,因为它在谷歌搜索中获得了很高的评级。执行位问题还没有真正得到解决,所以


如果没有在目录上设置execute位,那么它就不是“可遍历的”,这意味着shell和文件浏览器应该设计为不允许您将该目录设置为当前目录,尽管文件系统本身不能强制执行该功能。文件系统不允许在非执行目录中包含除所包含文件的文件名以外的任何信息,因此这些文件没有日期戳或文件权限,即使已设置读取,也不会读取这些文件。

对于CD目录,应为模式0555和文件0444。 Unix组可以看作是一个角色。 您的角色是您的补充组。 如果您不是所有者,则这些控制是强制性的。 如果你是,他们是自由裁量的。 只有对每个path元素具有执行/搜索权限时,才能遍历该路径。这与易受目录遍历攻击的Microsoft Windows不同。 它是为了实现彩虹系列而发明的
“国防部可信计算机系统评估标准”。

X位:但是如果我仍然可以从没有X位的目录中读取文件,为什么我需要它?哪个操作强制我实际更改到这个目录?S-bit:当然可以,但是可以在/tmp/目录中为每个用户创建子目录。也许还可以创建像/home/otto/tmp/->/tmp/otto/这样的硬链接,但是如果没有它,它仍然可以正常工作。我改进了答案,希望能够解决您评论的问题。它可能禁止实际上“更改”目录,但我仍然可以做我以前可以做的一切,那么它实际上有什么好处呢?我仍然可以做“ls foo/”和“ls foo/bar”,甚至“cat foo/bar/file”也可以。我还可以删除其中的文件。在你看来,traverse和read的区别是什么?如果我可以列出目录及其子目录中的所有文件,那么理论上我可以在其中搜索文件。那么为什么“find”不起作用呢?find不起作用是因为它(可能)试图将chdir转换成foo/,这是不允许的。这不是我希望得到的答案,但也许没有人知道他们为什么在开发这个操作系统时做出这个决定。多谢各位