事实上,我想问更一般的问题——“目录的写权限到底允许你做什么?” ——但是让我们用一个具体的例子来解决这个问题。
这是一个很长的问题,如果你很着急的话阅读粗体——它应该涵盖主要部分。
不同来源(好问题,多一个,格里莫尔的)对目录权限说类似以下内容:
r, read -- 读取目录内容(里面的文件名)
w, write -- 更改目录的属性(例如修改时间)并创建/重命名/删除其中的条目
x,搜索——访问里面的文件,你可以访问文件的索引节点,因此你可以到达它的实际内容
我的问题在于 的描述w
。它允许您访问哪些目录属性?我无法在只有写权限的目录中创建/重命名/删除文件:我创建了一个目录 ( tdir/
) 并在其中创建了一个文件 ( ) afile
、、、、、chmod -x-r tdir/
--都因权限拒绝而失败,除非我也对该目录设置了权限。mv tdir/afile tdir/af
rm tdir/afile
touch tdir/newfile
x
仅此一项x
并不授予您在目录内创建/重命名/删除文件的权限。
为了做到这一点,你需要x
和w
。
但确实touch tdir
改变了目录的修改时间w
。
我会以这种方式重新表述上述来源,以符合问题:目录r
允许您查看其中的文件名,但无法访问实际文件(索引节点);x
使您可以访问文件的索引节点(这意味着您可以查看它们的权限,并据此可以访问内容),但您仍然无法更改目录中的任何内容;目录实际上是某种文件,要更改其中的某些内容,您需要权限w
。
因此,当您更改目录中的某些内容时,您需要w
权限。如果您的更改需要目录中文件的索引节点——您x
也需要。
它解释了为什么不能仅使用以下命令删除目录中的文件w
:删除文件时,您需要将 inode 的链接计数减少 1 - 您需要知道 inode - 因此您需要x
目录。
但是为什么您需要x
创建(您可以要求系统创建一个文件而不暴露 inode?)并重命名/移动文件(当您移动文件时,您不会以任何方式更改它,您只更改记录目录内部及其 inode 计数?)?
也许这只是一个实施的事情?也就是说,您确实不需要 inode 来重命名/创建文件——您只需要文件名和w
权限;但inode和文件名构成目录中的一条记录;因此更改文件名 = 更改记录 = 访问 inode 的方式。
那么目录除了修改时间、权限、文件记录之外还有哪些属性呢?目录中还有哪些内容您只能更改w
?
答案1
x 使您可以访问文件的索引节点(这意味着您可以查看它们的权限,并据此可以访问内容),但您仍然无法更改目录中的任何内容;目录实际上是某种文件,要更改其中的某些内容,您需要 w 权限。
是的。
但是为什么需要 x 来创建(您可以要求系统创建一个文件而不暴露 inode?)并重命名/移动文件(当您移动文件时,您不会以任何方式更改它,您只更改目录内的记录及其 inode 计数?)?
如果没有x
,您只能影响目录本身 - 您从外部看到该目录。如果没有x
,目录条目将超出您的范围。如果您想要添加、删除或修改(例如重命名)目录中的条目,您需要能够访问该条目。
文件的权限决定了您可以对文件的内容执行哪些操作。目录的权限决定了您可以对文件的目录条目执行什么操作,因为目录条目是目录的内容。
目录中的写权限允许您创建和删除条目。重命名算作原子地创建一个条目并删除另一个条目。除此之外,目录具有与常规文件相同的元数据。写入权限还允许您更改目录的上次修改和上次访问时间戳。要更改目录的权限、组所有权或访问控制列表(如果支持),您需要拥有它。要更改其用户所有权,大多数 UNIX 变体都需要 root。