假设我有两个有名字的组测试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 上)的组名与用户名相同。如果您创建一个组并将用户放入其中,则删除后,该用户将属于其用户名所在的组。