没有x权限访问目录中的文件?


19

在理解目录的执行权限的含义时,我有些麻烦。我是否正确理解,即使目录中的内容赋予了用户特定权限,也无法访问用户没有x权限的目录中的任何内容?

还是用户仍然可以直接访问目录中的内容,但根本无法列出目录中的内容?

(我真正要了解的是,如果没有x权限,则其他用户无法访问该目录。)

Answers:


20

目录的x位也称为搜索位。实际上,它使您可以访问文件夹内列出的文件的索引节点。因此,如果要访问/home/user/foo/bar.txt,则必须在bar.txt的每个祖先上都具有搜索访问权限

从页面报价

由于目录的使用方式与常规文件不同,因此权限的工作方式略有不同(但仅略有不同)。尝试列出目录中的文件需要对该目录具有读权限,但不需要对该目录中的文件具有读权限。尝试将文件添加到目录,从目录中删除文件或重命名文件,所有这些操作都需要对该目录具有写权限,但是(可能令人惊讶地)不需要其中的文件具有写权限。执行权限不适用于目录(目录也不能是程序)。但是,该许可权位已用于其他目的的目录。

必须具有目录的执行权限才能将其cd入目录(即,使某个目录成为当前的工作目录)。

在目录上需要执行以访问其中文件的inode信息。您需要使用它来搜索目录以读取其中文件的索引节点。因此,通常将目录的执行许可权称为搜索许可权。

在许多常见情况下,需要搜索权限。考虑命令cat / home / user / foo。显然,此命令需要文件foo的读取权限。但是,除非您对/,/ home和/ home / user目录具有搜索权限,否则cat无法找到foo的索引节点,因此无法读取它!您需要在每个祖先目录上具有搜索权限才能访问任何文件(或目录)的索引节点,除非您可以访问其索引节点,否则您将无法读取文件。

请在文件权限目录部分中阅读更多内容。

更新:狮子座提出了一个很好的问题。如果我们知道索引节点,那么我们可以从未设置x位的目录访问文件吗?我相信,我们不应该这样做。我没有通过c程序对其进行测试,而是使用了一些方便的bash命令对其进行确认。

user@user-desktop:~/test$ ls -lart
total 12
drwxr-xr-x 49 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x  3 user user 4096 2011-11-30 22:37 .
drwxr-xr-x  2 user user 4096 2011-11-30 22:38 level1
user@user-desktop:~/test$ ls -lart level1/
total 12
drwxr-xr-x 3 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x 2 user user 4096 2011-11-30 22:38 .
-rw-r--r-- 1 user user    8 2011-11-30 22:38 file1
user@user-desktop:~/test$ stat level1
  File: `level1'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 808h/2056d  Inode: 95494       Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:46:16.576702105 +0530
Modify: 2011-11-30 22:38:12.386701913 +0530
Change: 2011-11-30 22:46:08.876702102 +0530
user@user-desktop:~/test$ stat level1/file1 
  File: `level1/file1'
  Size: 8           Blocks: 8          IO Block: 4096   regular file
Device: 808h/2056d  Inode: 60775       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:38:19.846701917 +0530
Modify: 2011-11-30 22:38:16.366701915 +0530
Change: 2011-11-30 22:38:16.366701915 +0530
user@user-desktop:~/test$ chmod -x level1
user@user-desktop:~/test$ stat level1/file1 
stat: cannot stat `level1/file1': Permission denied
user@user-desktop:~/test$ ls -lart level1/
ls: cannot access level1/..: Permission denied
ls: cannot access level1/.: Permission denied
ls: cannot access level1/file1: Permission denied
total 0
-????????? ? ? ? ?                ? file1
d????????? ? ? ? ?                ? ..
d????????? ? ? ? ?                ? .
user@user-desktop:~/test$ cat level1/file1
cat: level1/file1: Permission denied
user@user-desktop:~/test$ find . -inum 95494
./level1
user@user-desktop:~/test$ find . -inum 60775
user@user-desktop:~/test$ find ./level -inum 60775
find: `./level': No such file or directory
user@user-desktop:~/test$ find ./level1 -inum 60775

2
因此,如果我在目录中没有搜索权限的情况下具有文件/目录的索引节点号,只要其权限允许,我是否可以访问它?(尽管我认为,要获得无法执行统计的索引节点编号非常困难。)
Leo

@Leo我相信,我们不应该这样做。我已经更新了答案。如果您有一个小的c存根,请检查并告知我们。
Amey Jah的

1
@AmeyJah,实际上,我敢打赌。请考虑将文件硬链接到您拥有权限的另一个目录时会发生什么情况。相同的inode,但是您可以读取它。换句话说,读取许可权不依赖于系统查找inode可能属于的所有文件夹并查看它们是否具有x位。很好的答案。非常感谢。
user1477

@AmeyJah lsstat等使用stat(2)等。以防万一您现在不知道。我可以编写一个C程序,但是您的测试可以执行该程序将显示的所有内容,尽管可以做的更多是相同的:它使用syscalls(第2节)。库调用(第3节)比syscalls更高级别,但是不会改变任何内容(例如,remove(3)使用rmdir(2)作为目录,而unlink(2)用于文件)。
Pryftan

5

由于您要查找目录:

read表示:读取内容,即用ls列出它们。

写方式:写给导演。即创建文件或子目录。

execute表示:进入该目录。

读取和执行权限对于目录可能有点棘手。

例如,如果您具有读取权限但没有执行权限,则可以列出目录的内容,但不能将其放入其中。此外,即使您知道其名称,也无法列出特定的文件或目录。

如果您具有执行权限但没有读取权限,则可以将其放入其中,但不能直接列出文件。但是,如果您知道文件或目录的名称,则可以列出它们。


2
如果您具有读取权限但没有执行权限,则可以列出目录的内容,但是不能访问目录中的文件。如果您具有执行权限但没有读取权限,并且知道文件的名称,则可以访问(分类)它们。
dash17291

2

目录的执行权限意味着:

能够cd进入该目录,并访问该目录中的文件。

如果您x的目录没有权限,则不能:

  • 进入目录(即:cd
  • 无法访问此目录中的任何文件(即使您知道名称)。

例:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ cd testdir
bash: cd: testdir: Permission denied

$ cat testdir/a
cat: testdir/a: Permission denied

$ chmod 700 testdir
$ cat testdir/a
Some text.

阅读Linux File Permission Confusion pt 2,以获得有关该主题的出色介绍。

x权限似乎没有阻止的唯一一件事就是访问该目录中文件的名称

例:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ ls testdir
ls: cannot access testdir/a: Permission denied
ls: cannot access testdir/b: Permission denied
a  b
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.