在没有 x-permission 的情况下访问目录中的文件?

在没有 x-permission 的情况下访问目录中的文件?

我有点不明白目录的执行权限是什么意思。我是否正确理解了,即使目录中的内容赋予用户特定权限,用户没有 x 权限的目录中的任何内容都是无法访问的?

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

(我真正想了解的是,如果其他用户没有 x 权限,那么目录的访问安全性如何。)

答案1

目录的 x 位也称为搜索位。实际上,它使您能够访问文件夹内列出的文件的 inode。因此,如果您想访问 /home/user/foo/bar.txt,那么您必须对 bar.txt 的每个祖先具有搜索访问权限

引用自页面

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

需要对目录具有执行权限才能通过 cd 进入该目录(也就是说,使某个目录成为当前工作目录)。

需要对目录执行权限才能访问其中文件的 inode 信息。您需要执行权限才能搜索目录以读取其中文件的 inode。因此,目录上的执行权限通常被称为搜索权限。

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

更多详情请阅读文件权限目录部分。

更新:Leo 提出了一个很好的问题。如果我们知道 inode,那么我们是否可以从 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

由于您要求提供目录:

读意味着:读取内容,即用 ls 列出它们。

写意味着:写入目录。即创建文件或子目录。

执行意味着:进入该目录。

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

例如,如果您有读取权限但没有执行权限,那么您可以列出目录的内容但不能进入目录。此外,即使您知道特定文件或目录的名称,您也无法列出它们。

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

答案3

目录的执行权限意味着:

能够进入此目录并访问此目录中的文件。

如果您没有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 文件权限困惑 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

相关内容