我已经创建了目录 a,该目录具有这些权限 - 其他用户有
drwxr--r-- 5 用户 用户 4096 2012-09-15 19:30 站点
以另一个用户身份在目录上执行 ls -l 时
ls -l /主页/用户/网站
这是目录输出。我认为,如果该目录上没有设置 x 位,文件名根本就不会显示。
d????????? ? ? ? ? ? dev.user.com
-????????? ? ? ? ? ? user.20120914_082804.sql.gz
d????????? ? ? ? ? ? shared
-????????? ? ? ? ? ? shared.tar.gz
-????????? ? ? ? ? ? www.20120914_083256.tar.gz
d????????? ? ? ? ? ? www.user.com
这里是否存在矛盾?
答案1
x
允许你真正在目录并访问目录中的文件,r
授予您查看目录内容的权限。
如果您通过为目录提供位x
并删除位来扭转这种情况r
,那么用户可以打开shared.tar.gz
(假设文件本身具有适当的权限),但前提是他事先知道文件名,因为ls
无法列出目录中的文件。
答案2
这种对权限的解释可以追溯到早期的 Unix 文件系统。一开始,只有文件。(好吧,还有设备、管道等等……但我在这里试图讲述一个故事,并不是 100% 严格准确;此外,这对设备和管道以及其他所有东西都是正确的,因为所有东西都是文件,甚至目录也是如此)。
目录只是文件系统用来保存描述目录树及其所含文件的元数据的文件。目录中的每个文件都由一个简单的数据结构描述,该数据结构包含文件名的空间(最初为 14 个字符,IIRC)以及存储数据的 inode 编号、文件大小、时间戳和权限字。每个目录都以两个名为 和 的条目开头.
,..
第一个指向该目录的 inode,第二个指向其父目录的 inode。
权限字有 9 位,用于描述所有者、同一组的其他成员和整个世界的待遇。每个标记的 3 位表示相关用户是否可以读取、写入或执行文件。(您可能注意到,16 位权限字中还有 5 位我忽略了。这些最终确实被赋予了含义,但这与故事的这一部分无关。)(此外,这 9 位的解释在早期 Unix 的所有后代中基本保持不变,包括 Linux。)
因此,如果目录实际上只是一种特殊类型的文件,并且由某个目录中的条目描述,那么它显然也具有权限位,并且这些位可能具有某种含义。但问题是,到底意味着什么。赋予这些位含义的最简单方法是首先不要改变它们的含义。这基本上就是我们所做的。
因此,读取位意味着用户可以读取目录本身。这通常使读取器能够访问每个文件数据的文件名、时间戳、大小和 inode 编号。具体来说,使用r
set 可以ls
查看目录中所有文件的名称,但这不足以打开(或以任何方式使用)任何列出的文件。
执行位意味着用户可以“执行”目录。由于目录很特殊,因此执行实际上意味着按名称查找条目并使用它。这意味着如果x
设置了,您可以尝试打开文件,但如果没有,r
您将无法发现它们的名称。当然,所请求文件的权限也会影响访问,因此即使x
目录上有,您也无法读取文件,除非它还为您提供r
。
写入位意味着用户可以写入目录,但当然只能由文件系统本身来调解。这意味着使用w
set 您可以在目录中创建新文件,或编辑现有文件的目录条目。但如果没有x
set,您实际上无法使用任何文件,也没有 setr
您也无法看到它们。
随着 Unix 及其后代系统中用户身份模型变得越来越复杂,这些相同的基本描述却基本保持不变。
简而言之,r
意味着您可以看到它的内容,x
意味着您可以使用它,w
意味着您甚至可以修改它,即使是目录。