我正在学习文件模式权限
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
访问目录,但无法导航到那里:x
r
$ ls -ld test_access
drw-r--r-- 2 admin admin 4096 Jan 4 15:18 test_access
$ ls test_access
test_file
如果你查看和strace
的输出,你很快就会发现这些命令也使用了和系统调用的变体 ,它们也返回 EACCESrm
touch
stat()
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 发生的地方