目录有可执行文件模式

use*_*006 2 bash

我正在学习文件模式权限

666: for non-executable ordinary files 
777: for executable ordinary files 
777: for directories
Run Code Online (Sandbox Code Playgroud)

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

我发现这没有任何意义。目录条目无法执行,并且无法通过仅设置目录来设置目录中的所有文件“可执行”。

如何理解可执行目录项?

Ser*_*nyy 6

这已在Unix&Linux上的相关帖子中进行了介绍:

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

一个例子:

$ chmod -x test_access/
$ cd test_access/
bash: cd: test_access/: Permission denied
Run Code Online (Sandbox Code Playgroud)

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

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

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

chdir("test_access")                    = -1 EACCES (Permission denied)
Run Code Online (Sandbox Code Playgroud)

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

S_IXUSR

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

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

$ ls -ld test_access
drw-r--r-- 2 admin admin 4096 Jan  4 15:18 test_access
$ ls test_access
test_file
Run Code Online (Sandbox Code Playgroud)

如果您查看andstrace的输出,您很快就会发现这些命令也使用和 系统调用的变体,它们也返回 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
Run Code Online (Sandbox Code Playgroud)

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

[EACCES] 文件模式的权限位不允许请求的访问,或者路径前缀的某个组件的搜索权限被拒绝

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