이름이 있는 두 그룹이 있다고 가정해 보겠습니다.테스트1그리고테스트 2. 두 그룹 모두 동일한 그룹 ID 2000을 갖습니다. 그런 다음테스트 사용자2000의 GID를 사용합니다. 도중에 그룹 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의 답변또는 더 이상 실패하지 않도록 해당 사용자의 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
적어도 젠투에서는 모든 사용자의 기본 그룹은 사용자 이름과 동일한 그룹 이름을 갖는 것입니다. 그룹을 생성하고 그 그룹에 사용자를 추가한 경우, 제거되면 해당 사용자는 자신의 사용자 이름 그룹에 속하게 됩니다.