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

Nic*_*k.h 453 linux permissions directory

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

Chr*_*own 433

在 Linux 上对目录应用权限时,权限位与普通文件的含义不同。

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

  • 很好的答案,但我认为最后一句话具有误导性。实际上,每个文件都不能覆盖这些权限。这里的“访问”有点模棱两可:目录上的`+x` 授予通过这个*特定* 目录访问文件inode 的权限(不多也不少,好吧……也许`chdir` 也需要`+x`)。要读取或写入一个文件的内容,用户还需要对该文件的`+r`/`+w`,但这些是不同的权限(它们不会覆盖任何内容)。 (37认同)
  • 似乎这个答案没有提到写位和执行位的组合效果,正如鲍德里克的答案在下面提到的那样?即如果你只有写权限而没有执行权限,那么它是非常无用的。 (4认同)
  • 不可变标志是特定于文件系统的,它不会精确覆盖这些权限,这就是为什么我认为最后一句话具有误导性:-) (2认同)
  • @StéphaneGimenez“目录上的`+x`授予对文件索引节点的访问权限”——这似乎是一个很好的助记符,但也许并不能说明整个故事?如果没有在目录上设置执行位,则无法更改该目录中文件的文件名。我想知道为什么会这样,因为文件名存储在目录条目中,而不是索引节点中。 (2认同)

Bal*_*ick 314

首先,思考:什么是目录?它只是其中包含的项目(文件和其他目录)的列表。所以:目录=名称列表。

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

  • 你可以ls poems并且你会得到一个生活在其中的物品清单(-l不会透露任何细节!)。
  • 您可以使用命令行完成即touch poems/so <TAB> poems/somefile.
  • 你不能制作poems你的工作目录(即cd进入它)。

写入位= 如果设置,您可以修改此列表,即您可以{添加,重命名,删除} 名称。但!只有当执行位也被设置时,你才能真正做到这一点。

执行位= 将此目录设为您的工作目录,即cd进入其中。如果您想:

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

有趣的案例 1:如果您对目录具有写入 + 执行权限,即使您没有对这些项目的写入权限,您也可以 {delete,rename} 居住在其中的项目。(使用粘性位来防止这种情况)

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

概括:

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

PS:Kusalananda 提到的文章很好读。

  • 很好的答案,但过于关注术语“工作目录”。我需要`x` 位来*任何* 访问这个文件:对于`cat a/b/c/d`,我需要所有`a`、`b` 和`c` 上的`x` 位,甚至如果我不将它们用作 cwd。 (31认同)
  • 将目录视为列表会使事情更加清晰和合乎逻辑。 (23认同)
  • 如果你想让 `ls -l` 为一个文件夹工作,需要 `r` 和 `x` 权限。 (3认同)
  • 比最高票的答案要好得多! (3认同)
  • 这就是我发现你不能写的地方,除非它也是可执行的!案例2也很有趣,很好的答案! (2认同)
  • 另一个注意事项是,即使您对目录具有 `x` 权限,如果您没有对 **该文件** 内的 `x` 权限,您也无法真正“执行”该文件。例如,你只能`cat`它,但你不能运行文件本身。 (2认同)
  • 我要补充一点:*用脚本语言编写的程序文件也必须设置为可读才能执行*。摘自:https://superuser.com/a/684242/636058。 (2认同)

Dav*_*vid 80

我已经准备了这张表,其中包含所有可能的权限及其实际效果。

linux目录权限

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

一些想法

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

  • 很棒的总结图表。让我想知道有人在想什么让 `-W-` 在功能上等同于目录的 `---`。不是很直观。当然,这些类型的低级位通常不是。 (5认同)
  • 我在我的 mac 上对此进行了测试,但是使用 `-W-`,我可以重命名目录(在带有粘性位的目录中),但不能使用 `---`。这似乎有区别 (3认同)
  • @David,您错过了粘性位。 (3认同)
  • “_仅文件名:无法访问其他属性,例如大小或日期。_”这并不完全正确。是的,您无权访问存储所有属性的各个目标文件索引节点。但某些文件系统将部分内容缓存在目录条目中:基本上,您可以访问“readdir(3)”在“dirent”中返回的所有内容。在 POSIX 中,这至少包括(除了名称)inode 号;在 Linux 上还有文件类型。 (2认同)

Kus*_*nda 45

这是一篇关于这个的好文章。

概括:

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
Run Code Online (Sandbox Code Playgroud)

Hacking Linux Exposed 文章中还有更多信息。


alh*_*lal 9

来自Robert Love的书《LINUX System Programming》第 1 章的许可-

在此处输入图片说明


Dag*_*ang 5

对于任何访问文件或目录的操作,必须首先解析文件或目录的路径。该解决方案要求用户对路径中除最终路径组件之外的所有目录具有执行权限。所以对于目录,你可以认为执行位意味着“可解析”。

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

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

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

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

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