Удалить неуникальную группу с идентификатором группы в качестве основной группы пользователя

Удалить неуникальную группу с идентификатором группы в качестве основной группы пользователя

Допустим, у меня есть две группы с именамитестирование1итестирование2. Обе группы имеют одинаковый идентификатор группы 2000. Затем я добавляю пользователя с именемтестирование-пользовательс GID 2000. Попутно я хочу удалить группу testing2, но не могу, потому что при попытке получаю следующий ответ

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

Вот методы, которые я успешно опробовал для решения этой проблемы:

  • Изменил GID testing1, затем удалил testing2, затем изменил GID testing1 обратно на 2000

  • Изменен основной GID пользователя testing-user на отдельную группу, удалена testing2, затем назначена пользователю testing-user в testing1.

Есть ли лучший метод, не требующий изменения идентификаторов пользователей или групп?

решение1

Ошибка, которую вы получаете, — это ограничение способаgroupdelбыло написано и тот факт, что система разработана вокруг чисел (ID), а не имен. Как вы можете видеть висходный кодизgroupdel, он проверяет только, есть ли пользователь с 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, должна иметь имя группы, совпадающее с именем пользователя. Если вы создаете группу и помещаете в нее пользователя, то при удалении пользователь будет принадлежать к группе с его именем пользователя.

Связанный контент