概要

先だってはオプションを忘れがちなものを自動化するを元にスクリプト&コマンド化。

今度は、「慎重な操作を要する作業」を一気通貫で行うようにします。

要件

こんな要件のスクリプトを出力です。

  1. 削除するユーザ名を対話式で聞く
     → ない場合はExit
  2. /etc/passwd /etc/shadow /etc/group のバックアップを、 /etc/old/ファイル名.$(date +%Y%m%d)でバックアップ
     → それぞれファイル:○○をバックアップしましたの表示を出す
  3. ユーザのディレクトリも消すかを聞く y/n
  4. 削除前に以下の確認
     ユーザ名:○○を削除
     ユーザのホームディレクトを消す:y or no
    これでよろしいですか?
    → n : Exit
  5. y: ユーザデータを削除する
    ディレクトリを消すでy → userdel -r を実行してメッセージ出力、Exit
    ディレクトリを消すでn → userdel を実行してメッセージ出力、Exit

ここから更に

  • ホームディレクトリのバックアップを取るかどうかを聞く
  • 差分を表示するようにする

などを加えてできたスクリプトがこちらです。

免責

意図通りに動くかは一応、確認しましたが、
本番運用の前に、検証環境で、テストアカウントで実施してください。

準備

以下のディレクトリを作ります。

  • 設定ファイルのバックアップ先
sudo mkdir /etc/old
  • ホームディレクトリのバックアップ先
sudo mkdir /home/deleted_users

スクリプト内容

  • account_delete.sh
#!/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

通常アカウントは閲覧もできないようにします。

これで、操作時に確認をしつついざというときの切り戻しもできるようになります。