假設我有兩個有名字的組測試1和測試2。兩組的組 ID 相同,都是 2000。測試用戶GID為2000。
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 上)的群組名稱與使用者名稱相同。如果您建立一個群組並將使用者放入其中,則刪除後,該使用者將屬於其使用者名稱所在的群組。