두 개의 이름이 지정된 그룹이 있다고 가정해 보겠습니다.테스트 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
모든 사용자(적어도 젠투에서는)의 기본 그룹은 사용자 이름과 동일한 그룹 이름을 갖습니다. 그룹을 만들고 사용자를 그룹에 추가하면 삭제 후 해당 사용자는 자신의 사용자 이름으로 그룹에 속하게 됩니다.