スクリプトで生成された何百人ものユーザーを削除する方法は?

スクリプトで生成された何百人ものユーザーを削除する方法は?

私は以前、パスワードジェネレータの出力をユーザー名として100人以上のユーザーを生成するbashスクリプトを作成しました。これまでに見た最も近い解決策は、削除するユーザーのリストを作成し、そのリストを実行するスクリプトを作成することです。

不要なユーザーをすべて手動で一覧表示しなくても、これらのユーザーをすべて削除する方法やクイックオプションがあるかどうか疑問に思います。

答え1

コメントに投稿されたものは実際に最も簡単な解決策です。

お気に入りのテキストエディタを使って、、を開き、/etc/passwd削除します。/etc/shadow/etc/group

私が追加すべき唯一のことは、本当に(しなければならない自明ですが、そうではありません)は次のとおりです。そのファイルを編集する前にバックアップしてください。

だからあなたは次のようなものを得るでしょう:

sudo cp /etc/passwd /etc/passwd.bak
sudo cp /etc/shadow /etc/shadow.bak
sudo cp /etc/group /etc/group.bak
sudo -e /etc/passwd /etc/shadow /etc/group

もちろん今、返品これらのユーザーのホームディレクトリを削除する必要がありますが、問題は解決しません。ただし、ユーザー自体を削除するだけです。それがすべてです。


もしあなたならするホームディレクトリを削除する最も簡単な方法は、/etc/passwdバックアップコピーと変更されたコピーの違いをフィルタリングすることです。

comm -2 -3 /etc/passwd.bak /etc/passwd | cut -d: -f6,6 > /tmp/dirs-to-delete

それから(あなたはいつ非常にリストに必要なファイルのみが含まれていることを確認してください。リストを繰り返して、そのファイルをすべて削除します。

実際には、まず空白やその他の奇妙な条件を確認するために追加の完全性チェックを実行します。

awk 'NF > 1 { printf "Problem with entry <%s> on line %d\n", $0, NR }' /tmp/dirs-to-delete

そして、ディレクトリがすべて実際に存在することを確認してください。

for d in $(cat /tmp/dirs-to-delete); do
  [ -d "$d" ] ||
    printf 'Supposed directory <%s> is not a directory\n' "$d"
done

そして、どの文字もワイルドカードとして解釈されないようにする必要があります(特殊文字を使用して行の行番号を印刷します)。

sed -n '/[][*?]/=' /tmp/dirs-to-delete

しかし、本当に満足したら、次のようにしてください。

rm -rf $(cat /tmp/dirs-to-delete)

(参考に命令はジョンナは危険です。知らないなら正確にファイルに何が含まれていますか?注意しないと、ハードドライブが消去される可能性があります。 )

答え2

ユーザーの追加に使用したコマンド、オプション、およびシステム構成によって異なります。たとえば、システムがUID_MIN1000で起動するように構成されており、システムに1人のユーザー(UID 1000)しかない場合は、次のようなものを使用できます。リストのみをインポートするBashのユーザー数:

for user in $(cut -d : -f 1 /etc/passwd)
do
    user_id=$(id -g ${user})
    if [ ${user_id} -ge 1001 -a ${user_id} -le 1100 ]
    then
        echo ${user};
    fi
done

作成中にこれらのオプションを使用した場合は、作成したグループとホームフォルダを削除することもできます。

答え3

追加したユーザーを追跡し続けるか(たとえば、任意のユーザー名を作成した後にログファイルに存在する可能性があります)、2つのユーザーを区別するために使用できるパターンがない場合、またはこれを行うための良い方法があるかもしれません。 。削除したいユーザーと保持したいユーザー(例:すべての「実際の」ユーザー名にアルファベット文字のみが含まれ、任意のユーザー名にアルファベット以外の文字が含まれる場合があります)

これが節約できると思う唯一のケースは、保持したいユーザーセットが削除したいユーザーセットよりはるかに小さいか、どこかに連続してリストされている場合です。すべてのユーザーを一度に追加してから別のユーザーを追加しないと、実際にこれが発生する可能性があります。この場合、次のユーザーリストを取得できます。

cat /etc/passwd | tail -n 100 | cut -d: -f1

その後、削除することもできます(注:実行する前にすべてをもう一度確認してください!)。

for username in $(cat /etc/passwd | tail -n 100 | cut -d: -f1); do
    sudo userdel "${username}"
done

答え4

以下のユーザーIDを持つユーザーは、削除しないことを確認してユーザーを削除するには、以下の行を使用してください。1001

cat /etc/passwd | awk -F ":" '{print $1,$3}' | awk '$2 > 1001 {print “userdel -r”  “ “ $1}’

関連情報