사용자의 기본 그룹으로 그룹 ID가 있는 고유하지 않은 그룹을 제거합니다.

사용자의 기본 그룹으로 그룹 ID가 있는 고유하지 않은 그룹을 제거합니다.

두 개의 이름이 지정된 그룹이 있다고 가정해 보겠습니다.테스트 1그리고테스트 2. 두 그룹의 그룹 ID는 2000으로 동일합니다. 그런 다음테스트 사용자GID는 2000입니다. 도중에 Testing2 그룹을 삭제하고 싶지만 시도하면 다음과 같은 응답을 받기 때문에 삭제할 수 없습니다.

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

제가 시도한 성공 사례는 다음과 같습니다.

  • test1의 GID를 수정한 다음 test2를 삭제하고 test1의 GID를 다시 2000으로 변경합니다.

  • 테스트 사용자의 기본 GID를 별도의 그룹으로 수정하고, 테스트 2를 제거하고 테스트 사용자를 테스트 1에 할당합니다.

문제의 사용자 또는 그룹 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의 답변group_busy또는 다시 실패하지 않도록 해당 사용자의 GID를 일시적으로 변경합니다 .

답변2

사용자 그룹을 수정하려면 항상 제공된 유틸리티를 사용해야 하므로 안전하지 않습니다.

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

답변3

모든 사용자(적어도 젠투에서는)의 기본 그룹은 사용자 이름과 동일한 그룹 이름을 갖습니다. 그룹을 만들고 사용자를 그룹에 추가하면 삭제 후 해당 사용자는 자신의 사용자 이름으로 그룹에 속하게 됩니다.

관련 정보