在我的CMS中,我注意到目录需要将可执行位(+x)设置为用户打开它们。为什么读取目录需要执行权限,以及Linux中的目录权限如何工作?

评论

另请参见在Linux中,目录的“写入”权限等同于“执行”权限?和访问子目录时父目录的权限重要吗?

这样想:目录条目包含文件名,因此“读取”目录将列出文件,“使用”目录将访问文件。

设置目录执行位后,您就可以遍历其层次结构。如果您属于“其他”人,并且只设置了执行位(chmod 771 dirOne),则不能列出dirOne内容。但是,如果它包含一个子目录“ dirTwo”,其权限设置为(chmod 774 dirTwo),则您实际上可以列出其内容!

未来的访问者还应该在AskUbuntu上看到相关问题:askubuntu.com/q/1106822/295286

#1 楼

在Linux上将权限应用于目录时,权限位的含义与常规文件中的含义不同。


读取位(r)允许受影响的用户列出目录中的文件
写入位(w)允许受影响的用户在目录中创建,重命名或删除文件,并修改目录的属性
执行位(x)允许受影响的用户进入目录并访问内部的文件和目录
粘性位(Tt,如果为其他执行位设置)指出该目录中的文件和目录只能由其所有者(或根目录)删除或重命名


评论


很好的答案,但我认为最后一句话令人误解。实际上,每个文件都不能覆盖这些权限。这里的“访问”有点模棱两可:目录中的+ x允许通过此特定目录访问文件inode(没什么少,仅此而已,嗯……也许chdir也需要+ x)。要读取或写入一个文件的内容,用户还需要在该文件上使用+ r / + w,但这是不同的权限(它们不会覆盖任何内容)。

–StéphaneGimenez
2011-09-22 13:06



不可变标志是特定于文件系统的,它不会精确地覆盖那些权限,这就是为什么我认为最后一句话会引起误解:-)

–StéphaneGimenez
2011年9月22日在13:18

我认为在此答案和其他答案中提及ACL可能会很有用,因为如果仅考虑Chris Down提供的信息,则它们在某些目录中的应用可能会产生误导

–德米特里·科罗里奥夫
2014年12月29日12:30

似乎此答案没有提到写入位和执行位的组合效果,正如鲍德里克的答案在下面提到的那样?也就是说,如果您仅具有写许可权,但没有执行许可权,那么它就毫无用处。

– xji
2015年2月16日在8:55



@StéphaneGimenez“目录上的+ x授予对文件inode的访问权限”-似乎是个很好的主语,但也许并不能说明全部内容?如果没有在目录上设置执行位,则无法更改该目录中文件的文件名。我想知道为什么会这样,因为文件名存储在目录条目中,而不是inode中。

–凯文·惠勒
2015年12月17日在22:11

#2 楼

首先,请考虑:什么是目录?这只是其中的项目(文件和其他目录)的列表。因此:directory =名称列表。

读取位=如果设置,则可以读取此列表。因此,例如,如果您有一个名为poems的目录:


您可以使用ls poems,您将获得其中的物品清单(-l将不会透露任何细节!)。
您可以使用命令行补全功能,例如touch poems/so <TAB> poems/somefile
您不能将poems设置为您的工作目录(即cd)。

写入位=如果设置,则可以对其进行修改列表,即您可以在其上{添加,重命名,删除}名称。但!实际上,只有在同时设置了执行位的情况下,您才可以执行此操作。

执行位=使该目录成为您的工作目录,即cd。如果您要执行以下操作,则需要此权限:


访问(读取,写入,执行)其中的项目。
修改列表本身,即在其上添加,重命名,删除名称(当然,必须在目录上设置写位。)有趣的情况1:如果您具有目录的写+执行权限,则即使您在目录中,也可以{删除,重命名}其中的项目在这些项目上没有写许可。 (使用粘帖位可以防止这种情况发生)

有趣的情况2:如果您对目录具有执行(但没有写权限)并且对其中的文件具有写权限,则不能删除该文件(因为它涉及从列表中删除它)。但是,您可以擦除其内容,例如如果是文本文件,则可以使用vi将其打开并删除所有内容。该文件仍将存在,但将为空。

摘要:

读取位=您可以读取列表中的名称。写入位=您可以{添加如果还设置了执行位,则在列表上命名。执行位=您可以将该目录作为您的工作目录。

PS:Kusalananda提到的文章很不错。

评论


将目录视为列表可以使事情更加清晰和逻辑。

–三角龙
2014年1月9日在8:51



很好的答案,但也太关注术语“工作目录”。我需要x位来访问此文件:对于cat a / b / c / d,即使我不将它们用作cwd,我也都需要对a,b和c都使用x位。

– glglgl
2014年11月3日,9:24

在这里,我发现除非它也是可执行文件,否则您将无法编写!案例2也很有趣,很好的答案!

– Mirko
2014年11月30日,下午1:56

另一个需要注意的是,即使您对该目录具有x权限,如果对该目录中的文件没有x权限,您也无法真正“执行”该文件。例如,您只能将它作为目录,但不能运行文件本身。

– xji
2015年2月16日在9:19



如果要ls -l为文件夹工作,则需要r和x权限。

–王E
15年6月12日在9:48

#3 楼

我已经准备了具有所有可能的权限及其实际效果的表。



(*)仅文件名:其他属性(例如大小或日期)不可用。例如。您可以使用Tab键自动完成,但不能使用ls命令。

一些想法:


未设置X时,R和W几乎没有用。

单独使用X禁用RW会给您一种错误的安全感,因为您可能盲目地读写文件内容和访问子目录。您应该确保目录的每个直接子级都具有显式权限。
您很少使用以下值:



0:无访问权限。

1:允许遍历的最小访问权限。

5:允许读/写,但不能更改目录树本身的结构。

7:完整访问。




评论


很棒的摘要表。让我想知道有人在想-W-在功能上等同于---目录。不是很直观。当然,这些类型的低级位通常不是。

– CivFan
17年5月2日在21:06



另一个典型的用例是能够更改目录本身的权限。那如何受到不同连击的影响?

– CivFan
17年5月2日在21:20

我在Mac上进行了测试,但是使用-W-可以重命名目录(在带有粘性的目录中),但是不能使用---重命名。那似乎有所不同

–cozyconemotel
17年7月15日在1:45

@David,您错过了粘滞位。

–起搏器
17年11月21日在17:29

“仅文件名:其他属性(例如大小或日期)不可用。”这不是完全正确的。是的,您无权访问存储所有属性的相应目标文件索引节点。但是某些文件系统会将其中的一部分缓存在目录条目中:基本上,您可以访问readdir(3)在Dirent中返回的所有内容。在POSIX中,这至少包括(除了名称之外)索引节点号;在Linux上,文件类型也更多。

–丹尼尔(Daniel)
18年8月19日在22:32

#4 楼

这是一篇不错的文章。

摘要:

设置了x位的目录允许用户将cd(更改目录)
进入该目录,并访问其中的文件。

详细信息:



阅读(r


能够读取此目录中存储的文件名。



写(w


目录,创建新文件,或删除现有文件(如果您还具有执行权限)。如果没有执行权限,那么编写权限就没有意义。



执行(x


cd进入此目录,并访问此目录中的文件。



以下是一些应使其更易于理解的示例:

# "Full Access".  Reegen can list, create, delete, rename, delete,
# and stat any files in dir.
# Access to file contents is subject to the permissions
# of the file itself.
# New files can be created, any file can be deleted, regardless of
# file permissions.
drwx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except create,
# delete, or rename files in this directory.
dr-x------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except list the
# filenames in this directory.  If she suspects there is a file
# named "program" she can list it, but cannot do an 'ls'
# of the directory itself.  She can access any file (file
# permissions permitting) if she knows its name.  She can
# create new files, or rename/delete existing ones.
d-wx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen cannot create or delete any files in this directory.
# She can access any file (permissions permitting) if she
# knows its name already.
d--x------  1 reegen    reegen          4096 Jan 01 2003  dir


在Hacking Linux Exposed文章中甚至有更多信息。

#5 楼

摘自罗伯特·洛夫(Robert Love)的书“ LINUX系统编程”的第1章,内容许可-



#6 楼

对于访问文件或目录的任何操作,它必须首先解析文件或目录的路径。解决方案要求用户对路径上的所有目录(最终路径组件除外)具有执行权限。因此,对于目录,您可以认为execute位的意思是“可解决”。 2)对/a/b/c.txt具有读取权限; 3)对/的读写权限。


用户将无法读取(列出)/a,因为它没有读取权限。但是路径解析不会失败。
用户将能够读取(列出)/a/b,因为该用户具有对/a/b/c.txt/a的执行权限和对/a/b的读取权限。请注意,在读取/时,文件名/a可见,但是元数据(例如文件大小)和内容不可见,因为文件名与目录一起存储,而不与文件一起存储,而元数据存储在目录的inode中。文件。
用户将无法读取/a/b,因为在解析从/a/bc.txt/a/b/c.txt的路径时,由于用户没有执行权限,因此无法在/读取。

另请参见如何将路径名解析为文件。

#7 楼

一个有用的类比是将每个文件都视为一本书,将每个目录都视为保存该书的房间。

有一些规则可以列出房间中的所有名称:目录的位。从房间取出一本书的规则:目录的写入位。进入房间并探索的规则:结果目录执行位。

这些规则是独立的,不同于每本书的规则。有一些规则允许某人打开一本书并阅读其内容:每个文件的读取位。有修改书籍内容的规则:每个文件的写入位。执行文件:每个文件的执行位。

我写位是因为每个动作有三个位。所有者有一个读位,组有一个读位,其他所有人(其他人)有一个读位。如果为特定用户设置了这三个位中的任何一个,则该用户的读取位处于活动状态。无论用户,组或其他人如何发现该位都是有效的,都具有相同的有效结果。

因此,可以允许用户进入房间并移走书籍

这就是为什么需要读取目录的原因:控制允许谁列出房间内容(书名)的原因。 />
执行位用于控制谁可以进入书房。

#8 楼

目录执行的含义很清楚。由于没有遍历权限,因此与Windows不同,您必须重载某些内容。设计师选择了Execute,这引起了无尽的困惑。作为计算机安全人员,如果您将不打算实际执行的权限分配给某些人,那么它们看起来就很狡猾。

评论


执行许可位的发明要早于独特的遍历许可概念的发明大约二十年。这个答案的逻辑取决于一个与现实世界不同的历史时间轴,并且也没有注意到GENERIC_EXECUTE的存在及其含义。

– JdeBP
18年4月3日在7:34