ユーザーのデフォルトグループとして、グループIDを持つ一意でないグループを削除します。

ユーザーのデフォルトグループとして、グループIDを持つ一意でないグループを削除します。

2つの名前付きグループがあるとしましょう。テスト1そしてテスト2。 2 つのグループのグループ ID は 2000 と同じです。それからテストユーザーGIDは2000です。途中でTesting2グループを削除したいのですが、試してみると次のような応答が出るので削除できません。

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

私が試した成功事例は次のとおりです。

  • test1のGIDを変更してからtest2を削除し、test1の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の答えgroup_busyまたは、再度失敗しないように、そのユーザーのGIDを一時的に変更します。

答え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では)のデフォルトグループは、ユーザー名と同じグループ名を持ちます。グループを作成してユーザーをグループに追加すると、削除後、そのユーザーは自分のユーザー名でグループに属します。

関連情報