为何*nix系统中目录需执行权限?内核遍历与属性解析
为什么Unix/Linux目录需要执行权限才能遍历或切换?
Great question—this is one of those Unix permission quirks that trips up a lot of people at first, so let’s break it down clearly.
1. 内核遍历目录时需要执行权限的核心原因
当你遍历目录(比如访问/a/b/c/file.txt),内核的工作流程是这样的:
- 先从根目录
/的inode中查找a的inode编号 - 再从
a的inode中查找b的inode编号 - 接着从
b的inode中查找c的inode编号 - 最后从
c的inode中查找file.txt的inode编号,才能访问文件内容
这个在目录中查找子项inode编号的操作,内核就要求你拥有该目录的执行权限(x位)。没有这个权限,内核不会帮你完成目录项到inode的映射,自然无法遍历进入子目录或访问里面的文件。
2. 目录没有可执行数据,为啥要设执行权限?
Unix的权限模型是复用了r/w/x三位来适配不同类型的文件对象,对目录来说,这三位的意义和普通文件完全不同:
r(读权限):允许你读取目录的内容列表(比如用ls看到里面的文件名)w(写权限):允许你在目录中添加、删除或重命名文件/子目录(比如touch、rm、mv操作)x(执行权限,更准确叫搜索权限):允许你在目录中查找子项的inode(也就是能切换到该目录、访问里面的文件,哪怕你不知道文件名)
你提到的"可将该目录设为工作目录"其实是x权限的一个具体表现:当你cd到某个目录时,本质是告诉内核将当前进程的工作目录切换到它,但内核需要验证你是否有权限访问该目录的内容(哪怕只是切换过去),所以必须有x权限。
举个直观的例子:
- 如果目录
/mydir的权限是r--(只读无执行):你可以ls /mydir看到里面的文件名,但你不能cd /mydir,也不能cat /mydir/myfile——因为内核无法在/mydir中查找myfile的inode编号。 - 如果目录
/mydir的权限是--x(无读有执行):你看不到里面的文件名(ls会报错),但如果你知道里面有个myfile,并且myfile对你开放,你可以直接cat /mydir/myfile,也能cd /mydir(进去后ls还是看不到,但能操作已知的文件)。
内容的提问来源于stack exchange,提问作者Yuvraj Takey
相关产品推荐
相关产品推荐

