小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-05-16 / 42 阅读
0
0

Linux 使用 ‘useradd’ 命令的 ‘-g’ 选项指定组时,新用户为何不在 /etc/group 中作为组成员显示?

问题复现

sudo groupadd -g 2024 test123
sudo useradd -g 2024 qwer
sudo cat /etc/group #此时group文件test123组中没有qwer这个组成员
sudo groupdel test123
提示:不能移除用户"qwer"的主组

两个问题:

1.为什么/etc/group中test123组没有成员为qwer用户

2.为什么会提示出现不能移除test123的主组

原因

为什么/etc/group中test123组没有成员为qwer用户

当使用 useradd 命令的 -g 选项指定一个已存在的组作为新用户的主要组时,新用户会被添加到这个组中,但是这个组的成员列表(在 /etc/group 文件中)并不会自动更新显示新用户。
在Linux系统中,/etc/group 文件列出了所有的组以及它们的成员。但是,这个文件只显示那些通过 gpasswd 命令明确添加到组中的用户。当您使用 useradd 命令的 -g 选项时,新用户的主要组ID(GID)会被设置为您指定的组的GID,但是新用户的用户名并不会被添加到 /etc/group 文件中相应组的成员列表中。
这意味着,尽管新用户属于该组,并且可以享受该组的权限,但是在 /etc/group 文件的成员列表中并不会显示这个用户。这通常不是问题,因为用户的主要组是通过 /etc/passwd 文件中的GID来确定的,而不是通过 /etc/group 文件中的成员列表。
如果您需要将用户添加到 /etc/group 文件中相应组的成员列表中,您可以使用 gpasswd 命令:

sudo gpasswd -a username groupname

这将把用户 username 添加到组 groupname 的成员列表中,同时保持 username 的主要组不变。如果 username 已经是该组的主要组成员,这个命令不会有任何效果,因为主要组成员默认就是该组的成员,只是不会显示在 /etc/group 文件的成员列表中。

设计目的

在Linux系统中,/etc/group 文件用于记录系统上的组以及它们的成员。当您使用 groupadd 创建一个新组 test123,然后使用 useradd 创建一个新用户 qwer 并指定 test123 作为其主要组时,新用户 qwer 会被添加到这个组中,但是 qwer 用户的用户名不会出现在 /etc/group 文件中 test123 组的成员列表里。这是因为 /etc/group 文件中的成员列表仅用于记录附加组成员,而不用于记录主要组成员。
Linux这样设计的原因是,主要组信息已经通过 /etc/passwd 文件中的用户记录来管理了。每个用户在 /etc/passwd 文件中都有一个条目,该条目包含了用户的主要组ID(GID)。因此,系统可以通过 /etc/passwd 文件来确定用户的主要组,而不需要在 /etc/group 文件中再次记录这种信息。
这种设计的好处是:

  1. 避免重复:如果 /etc/group 文件中也记录了主要组信息,那么这将导致信息的重复,增加了管理的复杂性。
  2. 保持清晰/etc/group 文件仅用于记录哪些用户是哪些组的附加成员,这使得文件的结构和用途非常清晰。
  3. 效率:系统在查找用户的主要组时只需要查询 /etc/passwd 文件,而不需要同时查询 /etc/group 文件,这样可以提高效率。
  4. 一致性:每个用户只有一个主要组,而可以有多个附加组。这种设计保持了一致性,因为主要组是用户的默认组,而附加组则是可选的额外权限集合。
    总的来说,这种设计是为了保持系统文件的整洁、高效和一致。在大多数情况下,用户的主要组信息是通过 /etc/passwd 文件管理的,而 /etc/group 文件用于管理附加组信息。

为什么会提示出现不能移除test123的主组

在Linux系统中,当尝试删除一个用户的主组时,系统会报错,因为在用户账户和其主组之间存在着一种依赖关系。每个用户都有一个主组,这个组在用户创建时被自动创建,并且与用户的用户名相同。当您尝试删除这个主组时,系统会阻止这一操作,因为这会使得相关联的用户账户处于一种不正常的状态。
在您提供的命令中,test123 是一个组,而不是用户。qwer 是一个用户,其主组ID被设置为2024,这个组ID是与 test123 组相同的。因此,当您尝试删除 test123 组时,系统会报错,因为它检测到这个组是用户 qwer 的主组。
要正确地删除组 test123,您需要先确保没有任何用户将这个组作为他们的主组。您可以通过更改用户 qwer 的主组来做到这一点,然后再删除组 test123。下面是您应该执行的步骤:

  1. 将用户 qwer 的主组更改为另一个组,例如 users 组:
sudo usermod -g users qwer
  1. 现在您可以安全地删除组 test123
sudo groupdel test123

请确保在执行这些操作时您有足够的权限,并且这些更改符合您组织的政策和安全要求。

解决方式:

1.使用 useradd 命令的 -G 选项,将用户添加到附加组(supplementary groups)中,而不是设置用户的主要组(primary group)。如果这些附加组已经存在,那么用户的用户名会被添加到 /etc/group 文件中相应组的成员列表中。
例如,如果您执行以下命令:

sudo useradd -G 2024 qasdf

这个命令会将用户 qasdf 添加到组ID(GID)为2024的组中。如果这个组已经存在,那么 qasdf 用户的用户名会被添加到 /etc/group 文件中对应GID为2024的组的成员列表中。
/etc/group 文件中,该组的条目可能会更新为包含新用户的用户名,例如:

groupid:x:2024:qasdf

这里,groupid 是组的名称,x 表示组密码(通常不用于系统组),2024 是组的GID,而 qasdf 是添加到该组的用户名。
请注意,如果组ID 2024 对应的组不存在,那么 useradd 命令可能会失败,因为不能将用户添加到不存在的组中。如果需要创建一个新组并立即将用户添加到该组,应该首先使用 groupadd 命令创建组,然后再使用 useradd 命令添加用户。

2.先创建组然后使用gpasswd -a 添加用户,

具体如下:

1.创建组:

sudo groupadd test123

2.创建用户

sudo useradd qwer

3.将用户添加到组中

sudo gpasswd -a qwer test123

总结

在Linux系统中,使用 useradd 命令创建新用户时,如果您不指定 -g 选项,系统会自动创建一个与用户名同名的组,并将这个组设置为用户的主要组。如果您指定了 -g 选项并跟随一个已存在的组ID或组名,新用户将被添加到这个指定的组作为其主要组,而不会创建一个新的同名组。
当您使用 -G 选项时,您是在将用户添加到附加组中,这会在 /etc/group 文件中相应组的成员列表中添加用户的用户名。
主要组信息通常不记录在 /etc/group 文件中,因为它们已经通过 /etc/passwd 文件中的用户记录来管理了。这种设计避免了信息的重复,并保持了系统文件的结构清晰和高效。每个用户只有一个主要组,而可以有多个附加组,这些附加组提供了额外的权限集合。


评论