在我的CMS中,我注意到目录需要+x
为用户打开可执行位()设置。为什么读取目录需要执行权限,并且Linux中的目录权限如何工作?
chmod 771 dirOne
),因此您无法列出dirOne内容。但是,如果它包含一个子目录“ dirTwo”,其权限设置为(chmod 774 dirTwo
),则实际上可以列出其内容!
在我的CMS中,我注意到目录需要+x
为用户打开可执行位()设置。为什么读取目录需要执行权限,并且Linux中的目录权限如何工作?
chmod 771 dirOne
),因此您无法列出dirOne内容。但是,如果它包含一个子目录“ dirTwo”,其权限设置为(chmod 774 dirTwo
),则实际上可以列出其内容!
Answers:
在Linux上将权限应用于目录时,权限位的含义与常规文件的含义不同。
r
)允许受影响的用户列出目录中的文件w
)允许受影响的用户创建,重命名,或在目录中删除文件,并修改目录的属性x
)允许受影响的用户可以进入该目录,和访问文件和目录内T
或者t
如果执行位被设置为别人)指出,该目录中的文件和目录只能被删除或者被其所有者(或root)改名+x
在目录上通过该特定目录授予对文件inode的访问权限(无所不及,仅此而已,嗯……也许也chdir
需要+x
)。要读取或写入一个文件的内容,用户还需要+r
/ +w
对该文件的内容,但它们具有不同的权限(它们不会覆盖任何内容)。
+x
在目录上授予对文件inode的访问权限”-似乎是个很好的主语,但也许并不能说明全部内容?如果没有在目录上设置执行位,则无法更改该目录中文件的文件名。我想知道为什么会这样,因为文件名存储在目录条目中,而不是inode中。
首先,请考虑:什么是目录?这只是其中的项目(文件和其他目录)的列表。因此:目录=名称列表。
读取位 =如果设置,则可以读取此列表。因此,例如,如果您有一个名为的目录poems
:
ls poems
,您将获得其中生活物品的清单(-l
不会透露任何细节!)。touch poems/so <TAB> poems/somefile
。poems
工作目录(即cd
进入该目录)。写位 =如果设置,则可以修改此列表,即可以在其上{添加,重命名,删除}名称。但!实际上,只有在执行位也被设置的情况下,您才可以这样做。
执行位 =使该目录成为您的工作目录,即cd
进入该目录。如果您要执行以下操作,则需要此权限:
有趣的情况1:如果您具有目录的写+执行权限,即使您对这些项目没有写权限,也可以{删除,重命名}其中的项目。(使用粘性位防止出现这种情况)
有趣的情况2:如果您对目录具有执行(但未写)权限,并且对其中的文件具有写权限,则不能删除该文件(因为它涉及从列表中删除它)。但是,您可以擦除其内容,例如,如果它是文本文件,则可以使用vi打开它并删除所有内容。该文件仍将存在,但是将为空。
摘要:
读取位 =您可以读取列表上的名称。
写位 =如果也设置了执行位,则可以在列表上{添加,重命名,删除}名称。
执行位 =您可以将该目录设为您的工作目录。
PS:Kusalananda提到的文章很不错。
x
对位任何该文件的访问:对cat a/b/c/d
,我需要的x
所有的位a
,b
和c
,即使我不使用他们作为CWD。
x
对该目录具有权限,如果您对该目录中的文件没有x
权限,您也无法真正“执行”该文件。例如,您只能这样做,但不能运行文件本身。cat
ls -l
使用文件夹,则需要r
和x
权限。
我已经准备了具有所有可能的权限及其实际效果的表。
(*)仅文件名:其他属性(例如大小或日期)不可用。例如,您可以使用Tab键自动完成,但不能使用ls命令。
一些想法:
-W-
功能等同---
于目录。不是很直观。当然,这些类型的低级位通常不是。
-W-
,我可以重命名目录(在带有粘性的目录中),但是不能使用---
。似乎有所不同
摘要:
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文章中甚至有更多信息。
从罗伯特·洛夫(Robert Love)的书“ LINUX系统编程”的第1章中获得许可-
对于访问文件或目录的任何操作,它必须首先解析文件或目录的路径。解决方案要求用户对路径上除最终路径组件之外的所有目录都具有执行权限。因此,对于目录,您可以想到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
,因为用户没有执行权限。
另请参见如何将路径名解析为文件。
一个有用的类比是将每个文件都视为一本书,并且将每个目录都视为保存书本的房间。
有规则可以列出房间中的所有名称:目录的读取位。从房间取书的规则:目录的写入位。进入房间并探索的规则:生成的目录执行位。
这些规则是独立的,不同于每本书的规则。有一些规则允许某人打开一本书并阅读其内容:每个文件的读取位。有修改书籍内容的规则:每个文件的写入位。并执行一个文件:每个文件的执行位。
我写位是因为每个动作有3位。所有者有一个读位,组有一个读位,其他人(其他人)有一个读位。如果为特定用户设置了这三个位中的任何一个,则该用户的读取位处于活动状态。不要紧,该位是如何发现无论是要积极ü SER或摹 roup或Ø疗法,它具有相同的有效成果。
因此,可以允许用户进入房间并从图书馆移走书籍,但不允许阅读同一本书的内容。
这就是为什么需要读取目录的原因:控制允许谁列出房间内容(书名)的原因。
而执行位用来控制谁可以进入的书籍的房间。
目录执行的含义很清楚。由于没有遍历权限,因此与Windows不同,您必须重载某些内容。设计师选择了Execute,这引起了无尽的困惑。作为计算机安全人员,您将对您不打算实际执行的东西分配执行权限,这看起来很狡猾。
GENERIC_EXECUTE
及其含义。