+x
)设置为用户打开它们。为什么读取目录需要执行权限,以及Linux中的目录权限如何工作?#1 楼
在Linux上将权限应用于目录时,权限位的含义与常规文件中的含义不同。读取位(
r
)允许受影响的用户列出目录中的文件写入位(
w
)允许受影响的用户在目录中创建,重命名或删除文件,并修改目录的属性执行位(
x
)允许受影响的用户进入目录并访问内部的文件和目录粘性位(
T
或t
,如果为其他执行位设置)指出该目录中的文件和目录只能由其所有者(或根目录)删除或重命名评论
很好的答案,但我认为最后一句话令人误解。实际上,每个文件都不能覆盖这些权限。这里的“访问”有点模棱两可:目录中的+ 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/b
到c.txt
到/a/b/c.txt
的路径时,由于用户没有执行权限,因此无法在/
读取。另请参见如何将路径名解析为文件。
#7 楼
一个有用的类比是将每个文件都视为一本书,将每个目录都视为保存该书的房间。有一些规则可以列出房间中的所有名称:目录的位。从房间取出一本书的规则:目录的写入位。进入房间并探索的规则:结果目录执行位。
这些规则是独立的,不同于每本书的规则。有一些规则允许某人打开一本书并阅读其内容:每个文件的读取位。有修改书籍内容的规则:每个文件的写入位。执行文件:每个文件的执行位。
我写位是因为每个动作有三个位。所有者有一个读位,组有一个读位,其他所有人(其他人)有一个读位。如果为特定用户设置了这三个位中的任何一个,则该用户的读取位处于活动状态。无论用户,组或其他人如何发现该位都是有效的,都具有相同的有效结果。
因此,可以允许用户进入房间并移走书籍
这就是为什么需要读取目录的原因:控制允许谁列出房间内容(书名)的原因。
/>
执行位用于控制谁可以进入书房。
#8 楼
目录执行的含义很清楚。由于没有遍历权限,因此与Windows不同,您必须重载某些内容。设计师选择了Execute,这引起了无尽的困惑。作为计算机安全人员,如果您将不打算实际执行的权限分配给某些人,那么它们看起来就很狡猾。评论
执行许可位的发明要早于独特的遍历许可概念的发明大约二十年。这个答案的逻辑取决于一个与现实世界不同的历史时间轴,并且也没有注意到GENERIC_EXECUTE的存在及其含义。
– JdeBP
18年4月3日在7:34
评论
另请参见在Linux中,目录的“写入”权限等同于“执行”权限?和访问子目录时父目录的权限重要吗?这样想:目录条目包含文件名,因此“读取”目录将列出文件,“使用”目录将访问文件。
设置目录执行位后,您就可以遍历其层次结构。如果您属于“其他”人,并且只设置了执行位(chmod 771 dirOne),则不能列出dirOne内容。但是,如果它包含一个子目录“ dirTwo”,其权限设置为(chmod 774 dirTwo),则您实际上可以列出其内容!
未来的访问者还应该在AskUbuntu上看到相关问题:askubuntu.com/q/1106822/295286