刪除以群組 ID 為使用者主要群組的非唯一群組

刪除以群組 ID 為使用者主要群組的非唯一群組

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

相關內容