我正在学习文件模式权限
666: for non-executable ordinary files
777: for executable ordinary files
777: for directories
Run Code Online (Sandbox Code Playgroud)
参考可执行模式,
我可以理解程序文件具有可执行模式,但
不知道为什么目录也具有“可执行模式”。
我发现这没有任何意义。目录条目无法执行,并且无法通过仅设置目录来设置目录中的所有文件“可执行”。
如何理解可执行目录项?
这已在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
的输出,您很快就会发现这些命令也使用和 系统调用的变体,它们也返回 EACCESrm
touch
stat()
openat()
/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 发生的地方