Group

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

  • July 1, 2014

所以說我有兩個名稱為testing1testing2的組。兩個組具有相同的組 ID 2000。然後我添加了一個名為testing-user 的使用者,其 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?

您遇到的錯誤是groupdel編寫方式的限制以及系統是圍繞數字(ID)而不是名稱設計的事實。正如您在groupdel的原始碼中看到的那樣,它僅檢查是否存在具有您要刪除的 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);
}

因此,您要麼在mtm 的答案中使用 Perl 等其他工具弄亂配置文件,要麼臨時更改該使用者的 GID,這樣就group_busy不會再失敗了。

引用自:https://unix.stackexchange.com/questions/138496