据我了解,对于 Unix 文件权限,有“用户”、“组”和“世界”八位字节。为了便于讨论,我们假设 setuid/sticky 位不存在。
考虑以下示例:
$ echo "Hello World" > strange
$ chmod 604 strange
$ ls -l strange
-rw----r-- 1 mrllama foo 12 Apr 13 15:59 strange
假设还有另一个用户 ,john
他是我的组 的成员foo
。
- John对此文件有什么权限?
- 系统是否具有最具体的权限匹配(即约翰不是所有者,但他在组中
foo
,因此使用“组”八位字节的权限)? - ...或者它是否遵循适用于他的最宽松的八位字节(即约翰满足“团体”和“世界”的标准,因此它与两者中更宽松的八位字节一致)?
奖励问题:
- 如果改为权限怎么办
642
?约翰只能读,只能写,还是两者都可以? - 是否有任何理由拥有像这样的奇怪权限
604
?
答案1
使用 Unix 样式权限确定访问权限时,首先将当前用户与文件所有者进行比较,然后与组进行比较,所应用的权限是第一个匹配的组件的权限。因此,文件的所有者拥有所有者的权限(并且仅具有这些权限),文件组的成员具有该组的权限(并且仅具有这些权限),其他人都具有“其他用户”的权限。
因此:
- John 没有此文件的权限。
- 最具体的权限匹配获胜,而不是最宽松的(访问权限不累积)。
- 有了权限
642
,约翰就可以读取该文件。 - 授予权限是有原因的,例如
604
:这允许排除该组,这在某些情况下很方便 - 我在具有组的学术系统中看到过它students
,其中工作人员可以创建除学生之外的任何人都可以访问的文件。
root
可以访问所有内容,无论文件上定义的权限如何。
对于更复杂的访问控制,您应该研究SELinux和POSIX ACL。 (特别是 SELinux 甚至可以限制root
可以访问的内容。)
答案2
假设john
不带有 uid 0
,john
则没有权限,因为它john
是组的成员,并且由于组匹配,权限检查不会考虑世界位(来源:“Unix环境中的高级编程”,第4章,部分第一版第 5 页,第 80 页。)642
将导致4
出于同样的原因应用这些位。604
非常罕见,但可能适合某些人不希望其小组中的其他成员看到的内容。