目录具有可执行文件模式

目录具有可执行文件模式

我正在学习文件模式权限

666: for non-executable ordinary files 
777: for executable ordinary files 
777: for directories

关于可执行模式,
我可以理解程序文件具有可执行模式,但不知道
为什么目录也具有“可执行模式”。

我发现这没有意义。目录条目无法执行,并且不能仅通过设置目录就将目录内的所有文件设置为“可执行”。

如何理解可执行目录项?

答案1

这已在相关文章中介绍Unix和Linux

执行位 (x) 允许受影响的用户进入目录,并访问其中的文件和目录

一个例子:

$ chmod -x test_access/
$ cd test_access/
bash: cd: test_access/: Permission denied

这也可以防止创建/删除文件:

$ rm test_access/new_file 
rm: cannot remove 'test_access/new_file': Permission denied
$ touch test_access/another_file
touch: cannot touch 'test_access/another_file': Permission denied

执行权限实际上应该称为“访问”权限,因为当x文件或目录上没有设置位时,会导致EACCES错误。执行时你可以看到strace bash -c 'cd test_access/

chdir("test_access")                    = -1 EACCES (Permission denied)

在较低级别,此特定权限stat.h标准 Unix 库定义为

系统状态寄存器

执行/搜索权限,所有者。

当然,搜索指的是目录。请注意,读取目录包含的内容受r权限中的位限制。因此,如果没有位,但有位,我仍然可以ls访问目录,但无法导航到那里:xr

$ ls -ld test_access
drw-r--r-- 2 admin admin 4096 Jan  4 15:18 test_access
$ ls test_access
test_file

如果你查看和strace的输出,你很快就会发现这些命令也使用了和系统调用的变体 ,它们也返回 EACCESrmtouchstat()openat()


关于 ls 的附注

请注意,在默认/bin/bash为用户交互式 shell 的 Debian 系统上,ls通常是 的别名ls --color=auto。在这种情况下,您将看到如下错误:

$ ls test_access 
ls: cannot access 'test_access/test_file': Permission denied
ls: cannot access 'test_access/new_file': Permission denied
new_file  test_file

$ ls -l test_access 
ls: cannot access 'test_access/test_file': Permission denied
ls: cannot access 'test_access/new_file': Permission denied
total 0
-????????? ? ? ? ?            ? new_file
-????????? ? ? ? ?            ? test_file

其背后的原因在于 POSIX 定义EACCES

[EACCES] 文件模式的权限位不允许请求的访问,或者搜索权限在路径前缀的组成部分

具体来说,如果你运行,strace ls --color=auto test_access/你会看到ls尝试执行lstat()系统调用来确定目录条目类型,这是 EACCES 发生的地方

相关内容