在Linux上,文件有三组权限。一组用于文件组。在将文件分配给组之前,您可能需要检查组成员是谁。
文件和目录权限
Linux上的文件和目录对所有者有一组权限,对文件分配到的组有另一组权限以及对不属于前两个类别之一的所有人的权限。
每个权限集定义该类别的成员是否可以读取、写入或执行文件。对于目录,执行操作等同于能够cd到目录中。
文件或目录的默认组是所有者的默认组。这通常是创建它的人。组权限用于允许用户集合控制对该组其他成员的文件和目录的访问。
例如,您可能有一个开发团队、文档团队、研究团队等等。可以将每个团队的成员添加到适当命名的组中,以帮助协作。用户可以同时处于多个组中。
这是一个简单但稳健的方案。但是,如果你的文件是敏感的,在与他们分享你的工作之前,你可能会更乐意检查小组成员是谁。有不同的方法可以做到这一点。但要注意。最常推荐的两种方法存在问题。
RELATED:如何在Linux上使用chgrp命令
/etc/groups文件
“/etc/group”文件包含冒号“:”分隔的组和组成员列表。每行有四个字段。
- 名称:组的唯一名称。
- 密码:未使用。这将始终保持“x”
- 组ID:唯一的组标识符。
- 用户:以逗号分隔的组成员列表。对于系统帐户和守护程序帐户,列表通常为空。
要将文件的内容转储到终端窗口,可以使用cat,但可以用更少的资源滚动文件的内容更方便。
less /etc/group
列表顶部的大多数条目都没有成员,尽管“adm”组有两个,“cdrom”组只有一个。
如果我们想发现特定用户所在的组,可以使用grep搜索具有其用户帐户名的条目。这不是我们手头的任务。我们想看到的是一个团体中的每个成员,而不是一个人所属的团体。但看看对我们来说是有启发性的。
grep "dave" /etc/group
我们列出了包含字符串“dave”的条目。隐藏在他们中间的是一个迹象,表明事情可能不像我们想象的那么简单。
将用户添加到Linux时,默认操作是将其放入与其用户帐户同名的组中。这是他们的主要群体。添加到其中的任何其他组都称为次要组。
问题是用户没有被列为其主要组的成员。这就是为什么组“dave”没有显示任何成员,尽管用户“dave“是该组的成员。
当然,系统管理员可以将任何用户的主组更改为任何其他组的主组。这意味着用户可以是任何组的成员,但不会在“/etc/group”文件中列出。这是一个问题。
第二个问题是“/etc/group”文件不是唯一的真相来源。现代Linux安装可以在比“/etc/passwd”和“/etc/group”更多的位置存储用户和组信息,特别是在部署轻量级目录访问协议(Lightweight Directory Access Protocol)等服务的公司情况下。只看一个地方,你可能看不到全局。
在我们的测试场景中,我们为一个开发部门创建了四个组。他们是:
- resteam:研究团队。
- 开发团队:开发团队。
- pvqteam:产品验证和质量团队。
- 文档团队:文档团队。
我们为这些团队增加了人员。有些人属于多个团队。如果我们在less中打开“/etc/group”文件并滚动到文件底部,我们将看到新的组和组成员。至少,“/etc/group”文件知道多少成员就有多少。
如果要提取单个组,可以使用grep进行搜索。插入符号“^”表示一行的开始。
grep "^devteam" /etc/group
这将从文件中提取“devteam”条目并列出所有组成员。还是真的?
getent命令
getent命令检查多个数据库中的用户组信息,而不仅仅是“/etc/group”。我们将使用getent显示用户组。
getent group
将getent与group选项一起使用将在该测试机器上产生与使用“/etc/group”文件相同的结果。这是因为我们没有使用LDAP或任何其他集中式命名服务。因此,getent没有其他可参考的来源。
因此,结果与“/etc/group”文件中的结果一致也就不足为奇了。也许我们真正看到的是现实情况。也许一切都很简单,在这台电脑上你看到的就是你得到的?让我们对此保留判断。
getent命令可以为我们查看单个组。我们将看看“devteam”组。
getent group devteam
我们得到了与以前完全相同的结果。不过,有一种方法可以挖得更深。
RELATED:如何在Linux中列出用户
lid命令
lid命令是libuser工具集合的一部分。它已经安装在我们的Fedora 36测试计算机上,但必须安装在Ubuntu 22.04和Manjaro 21上。
此外,在Fedora和Manjaro上,该命令称为lid,但在Ubuntu上,需要使用libuser lid。
要在Ubuntu上安装该命令,请键入:
sudo apt install libuser
在Manjaro上,libuser是从AUR安装的,因此您需要使用自己喜欢的AUR助手。我们用了yay。
yay libuser
您可以使用libuser lid显示有关组或用户的组信息。要显示个人所在的组,请在命令行中传递其用户帐户名。在Fedora和Manjaro上,请记住使用盖子而不是libuser盖子。
sudo libuser-lib dave
要查看组的成员,请使用-g(group)选项和组的名称。
sudo libuser-lid -g devteam
瞧,一个名为“francis”的用户出现在列表中。这是我们第一次见到他。他没有列在“/etc/group”中,getent也没有发现他。
让我们看看使用groups命令的几个用户。
groups abigail
groups hayden
groups francis
- 用户“abigail”位于一个名为“abigail”的组中,另外两个组是“resteam”和“devteam”
- 用户“hayden”位于一个名为“haydon”的组中,另外两个组是“pvqteam”和“docteam”
- 用户“francis”位于单个组“devteam”组中。值得注意的是,他们不属于一个名为“弗朗西斯”的团体
我们知道,每个用户都必须是主组的成员,默认情况下,主组具有与用户的UID和帐户名匹配的GID和名称。用户“francis”似乎有些不同
让我们使用id命令,看看UID和GID告诉我们什么。
id abigail
id francis
用户“abigail”具有1002的UID和1002的GID。他们分为三个组,其中一个称为“abigail”。它的GID为1002。这是他们的默认主要组。
用户“francis”的GID为1019,与“devteam”组的GID匹配。此用户被分配了一个新的主组,或者在将此用户添加到系统时将“devteam”组设置为其主组。
无论是哪一个,只有libuser lid检测到它们,并报告它们存在于“devteam”组中。
细节决定成败
因此,重要的是要看到真正的细节。
小组是建立协作的一种很好的方式,只要你知道你要向谁开放。
RELATED:如何在Linux上使用chfn和usermod更改用户数据