删除以组 ID 作为用户主要组的非唯一组

删除以组 ID 作为用户主要组的非唯一组

假设我有两个有名字的组测试1测试2。两个组的组 ID 相同,均为 2000。然后我添加一个名为测试用户GID为2000。一路上我想删除组testing2,但我不能,因为当我尝试时,我得到以下响应

groupdel: cannot remove the primary group of user 'testing-user'

以下是我尝试过的成功方法:

  • 修改testing1的GID,然后删除testing2,然后将testing1的GID改回2000

  • 将testing-user的主GID修改为单独的组,删除testing2然后将testing-user分配给testing1

有没有更好的方法,不涉及修改有问题的用户或组 ID?

答案1

您收到的错误是方式的限制组删除是这样写的,事实上该系统是围绕数字(ID)而不是名称设计的。正如你所看到的源代码组删除,它仅检查是否存在将您要删除的 GID 作为其主要组的用户。如果有另一个组具有相同的 ID,但名称不同,也没关系。

/* [ Note: I changed the style of the source code for brevity purposes. ]
 * group_busy - check if this is any user's primary group
 *
 *      group_busy verifies that this group is not the primary group
 *      for any user.  You must remove all users before you remove
 *      the group.
 */
static void group_busy (gid_t gid)
{
        struct passwd *pwd;

        /* Nice slow linear search. */
        setpwent ();
        while ( ((pwd = getpwent ()) != NULL) && (pwd->pw_gid != gid) )
                ;
        endpwent ();

        /* If pwd isn't NULL, it stopped because the gid's matched. */
        if (pwd == (struct passwd *) 0)
                return;

        /* Can't remove the group. */
        fprintf (stderr,
                 _("%s: cannot remove the primary group of user '%s'\n"),
                 Prog, pwd->pw_name);
        exit (E_GROUP_BUSY);
}

所以你要么使用 Perl 之类的其他工具来搞乱配置文件mtm 的回答或者您临时更改该用户的 GID,这样group_busy就不会再失败。

答案2

这并不安全,因为您应该始终使用提供的实用程序来修改用户组,但是......

[ ! -f /etc/group.lock ] && perl -ne 'next if /^testing2:/; print' /etc/group > /etc/group.lock && mv /etc/group.lock /etc/group && grpconv

答案3

任何用户的默认组(至少在 Gentoo 上)的组名与用户名相同。如果您创建一个组并将用户放入其中,则删除后,该用户将属于其用户名所在的组。

相关内容