我刚刚遇到了一些关于 Linux (Arch Linux) 上的文件权限的意想不到的事情(对我来说)。基本上我有:
userX
在groupX
fileX userX:groupX ---rwx----
让我困惑的是:我无法对 执行任何操作 ( rwx
) fileX
。这是正确的吗?有人可以确认这确实是预期的行为吗?
我可以执行的唯一操作是mv
因为rm
我对父目录具有写权限。
问题是,我一直认为这些权限相互重叠,从最通用的权限开始(其他 -> 组 -> 用户)。换句话说,o=rwx
谁关心组和用户的权限是什么?显然情况并非如此,但这对我来说没有多大意义;这似乎违反直觉。这种方法似乎唯一有用的地方是轻松排除非常特定的人/群体,这似乎不是一个明智的方法(恕我直言)。此外,所有者(和团体?)应该能够,chmod
对吧?对此事有什么想法吗?
答案1
问题是,我一直认为这些权限相互重叠,从最通用的权限开始(其他 -> 组 -> 用户)。
如果是这样的话,那么“其他”权限将适用于每个人。
换句话说,如果 o=rwx 谁关心组和用户的权限是什么?
这和你上一句话不同。这里你暗示权限是或在一起的,例如,如果 userX 拥有该文件并且该文件是用户可读的,或者如果 userX 所属的组拥有该文件并且该文件是组,则 userX 具有读取权限-可读,或者文件是否是其他可读的。但事实并非如此。事实上,o=rwx
意味着rwx
权限适用于其他人,但它没有说明任何关于非其他实体的信息。
首先,用户属于哪个组并不直接重要。内核没有用户属于组的概念。内核为每个进程维护的是一个用户 ID(有效UID)和一个列表组ID(有效 GID 和补充 GID)。这些组是在登录时由登录进程确定的——登录进程读取组数据库(例如/etc/group
)。用户和组 ID 由子进程继承。
当进程尝试使用传统 Unix 权限打开文件时:
- 如果文件的所有者用户是进程的有效 UID,则使用用户权限位。
- 否则,如果文件的所属组是进程的有效 GID 或进程的补充组 ID 之一,则使用组权限位。
- 否则,使用其他权限位。
仅使用了一组 rwx 位。用户优先于组,组优先于其他组。当有访问控制列表,上述算法被推广:
- 如果文件上存在进程有效 UID 的 ACL,则它用于确定是否授予访问权限。
- 否则,如果文件上存在进程的有效 GID 或进程的补充组 ID 之一的 ACL,则使用组权限位。
- 否则,使用其他权限位。
也可以看看用户属于多个组时 ACLS 的优先级有关如何使用 ACL 条目的更多详细信息,包括掩码的效果。
因此-rw----r-- alice interns
表示Alice可以读取和写入的文件,并且除实习生之外的所有其他用户都可以读取该文件。具有权限和所有权的文件----rwx--- alice interns
只有实习生可以访问,除了 Alice(无论她是否是实习生)。由于Alice可以调用chmod
来更改权限,因此这并不能提供任何安全性;这是一个边缘情况。在具有 ACL 的系统上,通用机制允许删除特定用户或特定组的权限,这有时很有用。
使用一组位,而不是为每个操作(读、写、执行)对所有位进行“或”运算,有几个优点:
- 它具有允许在具有 ACL 的系统上删除一组用户或组的权限的有用效果。在没有 ACL 的系统上,可以从一组中删除权限。
- 实现起来更简单:检查一组位,而不是将多组位组合在一起。
- 分析文件的权限更简单,因为涉及的操作更少。
1当出现以下情况时,它们可以改变:设定值或setgid进程被执行。这与当前的问题无关。
答案2
更具体的权限优先于不太具体的权限。
组 X 中的用户 X
文件X 用户X:组X ---rwx----
由于您是文件的所有者,因此您将仅被授予所有者权限。所有者没有权限。因此,你什么也做不了。如果您不是文件的所有者和组成员,则将应用组权限。
请阅读维基页面的这一部分
https://en.wikipedia.org/wiki/File_system_permissions#Classes
答案3
-rwxrw----
表示所有者有读、写、执行权限,所属组有读、写,其他没有权限。
您提供的权限授予组“groupX”读取、写入和执行该文件的权限。如果您是“groupX”组的成员,但不是文件的所有者,则这些权限将适用于您。
在这种情况下,我假设您确实是该文件的所有者。只有为所有者设置的权限才会适用于您。当然,所有者可以覆盖或更改文件的权限。然而,该集团无法做到这一点。例如,vim 会提示您确认是否正在写入一个您没有写权限但属于其所有者的文件。
我通常从左到右读取权限。我是主人吗?如果是,则适用所有者权限。如果不;我是该团体的成员吗?如果是,则适用组权限。如果没有,那么“其他”的权限适用于我。
在某些情况下,成为文件的所有者但没有写权限会很有用。它可以防止您意外删除或修改文件。就我个人而言,我对所有模板文件设置了权限 400,只是为了确保我不会意外修改它们。执行权限也是如此。
答案4
我能够将用户添加到组中,授予该组对目录(070)的权限,然后在重新启动后能够访问该文件夹。
创建组:sudo groupadd 组名
将用户添加到组:sudo gpasswd -a 用户名 组名
确保整个目录处于正确的组所有权之下(必须是组名的当前成员才能执行):sudo chgrp -R 组名 目录路径/
仅给出文件夹的组 rwx (可以只是 rw,根据需要调整):sudo chmod -R 070 目录路径
完成上述操作后,请确保注销并重新登录。如果这不起作用,请重新启动计算机。这样做对我有用。