概要
先だってはオプションを忘れがちなものを自動化するを元にスクリプト&コマンド化。
今度は、「慎重な操作を要する作業」を一気通貫で行うようにします。
要件
こんな要件のスクリプトを出力です。
- 削除するユーザ名を対話式で聞く
→ ない場合はExit
- /etc/passwd /etc/shadow /etc/group のバックアップを、 /etc/old/ファイル名.$(date +%Y%m%d)でバックアップ
→ それぞれファイル:○○をバックアップしましたの表示を出す
- ユーザのディレクトリも消すかを聞く y/n
- 削除前に以下の確認
ユーザ名:○○を削除
ユーザのホームディレクトを消す:y or no
これでよろしいですか?
→ n : Exit
- y: ユーザデータを削除する
ディレクトリを消すでy → userdel -r を実行してメッセージ出力、Exit
ディレクトリを消すでn → userdel を実行してメッセージ出力、Exit
ここから更に
- ホームディレクトリのバックアップを取るかどうかを聞く
- 差分を表示するようにする
などを加えてできたスクリプトがこちらです。
免責
意図通りに動くかは一応、確認しましたが、
本番運用の前に、検証環境で、テストアカウントで実施してください。
準備
以下のディレクトリを作ります。
sudo mkdir /etc/old
sudo mkdir /home/deleted_users
スクリプト内容
#!/bin/bash
# 1. ユーザ名を対話的に聞く
read -p "削除するユーザ名を入力してください: " username
# ユーザが存在しない場合は終了
if ! id "$username" &>/dev/null; then
echo "ユーザ '$username' は存在しません。終了します。"
exit 1
fi
# 2. バックアップを作成
backup_dir="/etc/old"
backup_date=$(date +%Y%m%d)
backup_passwd="$backup_dir/passwd.$backup_date"
backup_shadow="$backup_dir/shadow.$backup_date"
backup_group="$backup_dir/group.$backup_date"
cp /etc/passwd "$backup_passwd"
cp /etc/shadow "$backup_shadow"
cp /etc/group "$backup_group"
echo "ファイル:$backup_passwd をバックアップしました。"
echo "ファイル:$backup_shadow をバックアップしました。"
echo "ファイル:$backup_group をバックアップしました。"
# 3. ユーザのディレクトリを消すかどうかを確認
read -p "ユーザのディレクトリも削除しますか? (y/n): " delete_home
# 4. ユーザディレクトリのバックアップを取るかどうかを確認
backup_home=""
if [ "$delete_home" == "y" ]; then
read -p "ユーザのホームディレクトリのバックアップを取りますか? (y/n): " backup_home_choice
if [ "$backup_home_choice" == "y" ]; then
backup_home="/home/deleted_users/$username.$backup_date"
cp -r /home/$username "$backup_home"
echo "ユーザ '$username' のホームディレクトリをバックアップしました。"
fi
fi
# 5. 削除前に確認
echo -e "\nユーザ名: $username を削除"
echo -e "ユーザのホームディレクトリを消す: $delete_home"
echo -e "ユーザのホームディレクトリのバックアップを取る: $backup_home\n"
read -p "これでよろしいですか? (y/n): " confirm
if [ "$confirm" == "n" ]; then
echo "終了します。"
exit 0
fi
# 6. ユーザデータを削除
if [ "$delete_home" == "y" ]; then
userdel -r "$username"
echo "ユーザ '$username' のデータとディレクトリを削除しました。"
else
userdel "$username"
echo "ユーザ '$username' のデータを削除しました。"
fi
# 7. バックアップと現在の差分を表示するかどうかを尋ねる
read -p "アカウント削除後、バックアップと現在の差分を表示しますか? (y/n): " show_diff
if [ "$show_diff" == "y" ]; then
diff_passwd=$(diff /etc/passwd "$backup_passwd")
diff_shadow=$(diff /etc/shadow "$backup_shadow")
diff_group=$(diff /etc/group "$backup_group")
echo -e "\n--- ファイル:$backup_passwd との差分 ---\n$diff_passwd"
echo -e "\n--- ファイル:$backup_shadow との差分 ---\n$diff_shadow"
echo -e "\n--- ファイル:$backup_group との差分 ---\n$diff_group"
fi
echo "終了します。"
実行権付与
sudo chown root:root account_delete.sh
root権限でしか触れないコマンドなので、所有者もrootにします。
sudo chmod 700 account_delete.sh
通常アカウントは閲覧もできないようにします。
これで、操作時に確認をしつついざというときの切り戻しもできるようになります。