执行与读取位。Linux中的目录权限如何工作?


380

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


17
...呃,因为这就是“ + x”标志的
含义


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

7
设置目录执行位后,您就可以遍历其层次结构。由于您属于“其他”人,并且仅具有执行位(chmod 771 dirOne),因此您无法列出dirOne内容。但是,如果它包含一个子目录“ dirTwo”,其权限设置为(chmod 774 dirTwo),则实际上可以列出其内容!
斯特凡,

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

Answers:


351

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

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

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

2
不可改变的标志是文件系统的指定,它不会精确覆盖这些权限,这就是为什么我认为最后一句是误导:-)
斯特凡希门尼斯

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

4
似乎这个答案没有提到写入位和执行位的组合效果,正如鲍德里克的答案在下面提到的那样?即,如果您仅具有写许可权而不具有执行许可权,那么它就毫无用处。
xji

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

259

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

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

  • 可以ls poems,您将获得其中生活物品的清单(-l不会透露任何细节!)。
  • 您可以使用命令行完成功能,即touch poems/so <TAB> poems/somefile
  • 您无法建立poems工作目录(即cd进入该目录)。

写位 =如果设置,则可以修改此列表,即可以在其上{添加,重命名,删除}名称。但!实际上,只有在执行位也被设置的情况下,您才可以这样做。

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

  • 访问(读取,写入,执行)其中的项目。
  • 修改列表本身,即添加,重命名,删除列表上的名称(当然,必须在目录上设置写位)。

有趣的情况1:如果您具有目录的写+执行权限,即使您对这些项目没有写权限,也可以{删除,重命名}其中的项目。(使用粘性位防止出现这种情况)

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

摘要:

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

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


17
将目录视为列表可以使事情变得更加清晰和逻辑。
Trismegistos 2014年

20
很好的答案,但也太关注术语“工作目录”。我需要x对位任何该文件的访问:对cat a/b/c/d,我需要的x所有的位abc,即使我不使用他们作为CWD。
glglgl 2014年

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

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

2
如果要ls -l使用文件夹,则需要rx权限。
Eric Wang

44

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

linux目录权限

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

一些想法

  • 如果未设置X,则R和W几乎没有用。
  • 单独使用X 禁用RW会给您一种错误的安全感,因为您可能盲目地读写文件内容和访问子目录。您应该确保目录的每个直接子级都具有显式权限。
  • 很少使用以下值:
    • 0:无访问权限。
    • 1:最小访问允许遍历。
    • 5:允许读/写,但不能更改目录树本身的结构。
    • 7:完全访问权限。

1
当您想允许读/写但不更改目录树本身的结构时,我认为5是一个有用的值。
hgiesel

你是对的。更新!
大卫

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

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

3
@David,您缺少粘滞位。
Pacerier's

42

这是一篇很好的文章。

摘要:

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文章中甚至有更多信息。



2

对于访问文件或目录的任何操作,它必须首先解析文件或目录的路径。解决方案要求用户对路径上除最终路径组件之外的所有目录都具有执行权限。因此,对于目录,您可以想到execute位意味着“可解决”。

以路径/a/b/c.txt为例,假设用户具有1)对/和的执行权限/a;2)具有阅读权限/a/b;3)的读写权限/a/b/c.txt

  • 用户将无法读取(列出)/a,因为它没有读取权限。但是路径解析不会失败。

  • 用户将可以读取(列出)/a/b,因为该用户具有的执行权限//a并具有的读取权限/a/b。请注意,在读取时/a/b,文件名c.txt可见,但元数据(例如文件大小)和内容不可见,因为文件名与目录一起存储,而不与文件一起存储,而元数据存储在文件的inode中。

  • 用户将无法读取/a/b/c.txt,因为从解决路径时//a/a/b,它在失败/a/b,因为用户没有执行权限。

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


0

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

有规则可以列出房间中的所有名称:目录的读取位。从房间取书的规则:目录的写入位。进入房间并探索的规则:生成的目录执行位。

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

我写位是因为每个动作有3位。所有者有一个读位,组有一个读位,其他人(其他人)有一个读位。如果为特定用户设置了这三个位中的任何一个,则该用户的读取位处于活动状态。不要紧,该位是如何发现无论是要积极ü SER或 roup或Ø疗法,它具有相同的有效成果。

因此,可以允许用户进入房间并从图书馆移走书籍,但不允许阅读同一本书的内容。

这就是为什么需要读取目录的原因:控制允许谁列出房间内容(书名)的原因。

执行位用来控制谁可以进入的书籍的房间。


-1

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


1
执行许可位的发明要比独特的遍历许可的概念早发明约二十年。这个答案的逻辑取决于一个与现实世界不同的历史时间轴,并且也没有注意到它的存在GENERIC_EXECUTE及其含义。
JdeBP '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.