ユーザーのプライマリグループとしてグループ ID を持つ一意でないグループを削除します。

ユーザーのプライマリグループとしてグループ ID を持つ一意でないグループを削除します。

たとえば、2つのグループがあり、テスト1そしてテスト2両方のグループは同じグループID2000を持っています。次に、テストユーザーGIDは2000です。途中でグループtesting2を削除したいのですが、削除できません。試すと次の応答が返されます。

groupdel: cannot remove the primary group of user 'testing-user'

私が成功するために試した方法は次のとおりです。

  • テスト1のGIDを変更し、テスト2を削除し、テスト1の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

少なくとも Gentoo では、どのユーザーのデフォルト グループも、グループ名がユーザー名と同じになります。グループを作成してユーザーをその中に入れた場合、そのユーザーが削除されると、そのユーザーはユーザー名のグループに属することになります。

関連情報