bashでlinuxのユーザーのパスワードを変更するスクリプトを実行（メモ）

サーバーの移行Prjでセキュリティ上、今までのユーザーのパスワードを変更する要望があったので、まとめてパスワードを変更する

やってみたので、メモとして残す。

## 環境
- AWS EC2
- RHEL8.8

## bashスクリプト説明

- Linuxユーザーのパスワードを変更するスクリプト
- CSVファイルのユーザー名と新しいパスワードに基づいて、ユーザーのパスワードを変更する。

## 前提

- csvファイルを用意
    - 形式　ユーザー名,パスワード　ファイル名はなんでも可 例）user_password.csv
- 以下記述の.shのスクリプトを用意　名前例./change_password_script.sh

実行方法

```bash
sudo bash ./change_password_script.sh user_password.csv
```

ヘルプオプションをつけると説明を表示する

```bash
sudo bash ./change_password_script.sh  --help
```

パスワードを変更するスクリプト

```bash
#!/bin/bash

# 説明
## Linuxユーザーのパスワードを変更するスクリプト
## CSVファイルのユーザー名と新しいパスワードに基づいて、ユーザーのパスワードを変更する。

# 前提
## ファイル名なんでも可のcsvファイルを用意（例user_password.csv）
## 形式 ユーザー名,パスワード

# 実行
## sudo bash ./change_password_script.sh user_password.csv
## helpオプションをつけて説明を表示
## sudo bash ./change_password_script.sh  --help

# ヘルプメッセージ
help_message="使用方法: $0 <csv_ファイル>
CSVファイル内のユーザーのパスワードを変更します。
CSVファイルの形式: ユーザー名,パスワード"

# ヘルプ関数
show_help() {
    echo "$help_message"
    exit 0
}

# 引数が0の場合、ヘルプメッセージを表示して終了
if [ $# -eq 0 ]; then
    show_help
fi

# 引数からCSVファイルのパスを受け取る
csv_file="$1"

# ヘルプオプションが指定された場合、ヘルプメッセージを表示して終了
if [ "$csv_file" == "--help" ] || [ "$csv_file" == "-h" ]; then
    show_help
fi

# CSVファイルが存在しない場合、エラーメッセージを表示して終了
if [ ! -f "$csv_file" ]; then
    echo "エラー: 指定されたCSVファイル '$csv_file' が存在しません。"
    exit 1
fi

# CSVファイルからユーザー名と新しいパスワードを読み取り、変更します。
while IFS=',' read -r user password; do
    # ユーザーが存在するか確認
    if ! id "$user" &>/dev/null; then
        echo "エラー: ユーザー '$user' が存在しません。"
        continue
    fi

    # パスワードを変更
    echo -e "$password\n$password" | passwd "$user" 2>/dev/null

    if [ $? -eq 0 ]; then
        echo "ユーザー $user のパスワードを変更しました。"
    else
        echo "エラー: ユーザー $user のパスワードの変更に失敗しました。"
    fi
done < "$csv_file"

# スクリプトの実行が完了しました。
echo "スクリプトの実行が完了しました。"
```

一応以下２つのエラーハンドリングも追加してます。

- ユーザーが存在しない
- パスワードが有効でない（8桁以上じゃないとパスワード変更できない、メッセージは一般的なメッセージ）
## AWSでテストをする



1. SSHでEC2インスタンスに接続:

    
    ```bash
    ssh -i ~/.ssh/公開鍵.pem  ec2-user@パブリックIPアドレス　
    ```
    
2. ユーザーを作成:
　試したいだけなので、なんでもいいので、user1とかにしてます。
    
    ```bash
    sudo useradd user1
    sudo useradd user2
    sudo useradd user3
    
    ```
    
3. パスワードを設定:
    パスワードの入力を2回求められます。8桁以上
    
    ```bash
    sudo passwd user1    
    ```
    
   
### 検証について
　　スクリプト実行後パスワードがちゃんと設定されているか確認のため、公開鍵ではなく、パスワードで認証するように変更する。

1. SSHサーバーのパスワード認証を可能にする:

     ```bash
        sudo vi /etc/ssh/sshd_config
    ```
　 この行を見つけて、コメントアウトを削除

```
 PasswordAuthentication yes    
 ```
  
        
2. SSHサービスを再起動:
   変更を反映させるためにSSHサービスを再起動。

    ```bash
        sudo systemctl restart sshd        
    ```

これで準備ができた。
    
## シェルスクリプト作成＆実行 
シェルスクリプト作成

```bash
　　$ vi change_password_script.sh
　　$ cat change_password_script.sh
```

上で書いたスクリプトが表示されればOK
    
シェルスクリプト実行
    
```bash
    $ sudo bash change_password_script.sh  --help
    使用方法: change_password_script.sh <csv_ファイル>
    CSVファイル内のユーザーのパスワードを変更します。
    CSVファイルの形式: ユーザー名,パスワード
```
    
helpコマンドでちゃんとhelpメッセージが出ることを確認
    
csvファイルを置く
    
```bash
    $ vi user_password.csv
    $ cat user_password.csv
    user1,test1test1
    user2,test2test2
    user3,test3test3
```
    
スクリプト実行
    
```bash
    $ sudo bash ./change_password_script.sh user_password.csv
    Changing password for user user1.
    New password: BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT characters
    Retype new password: passwd: all authentication tokens updated successfully.
    ユーザー user1 のパスワードを変更しました。
    Changing password for user user2.
    New password: BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT characters
    Retype new password: passwd: all authentication tokens updated successfully.
    ユーザー user2 のパスワードを変更しました。
    Changing password for user user3.
    New password: BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT characters
    Retype new password: passwd: all authentication tokens updated successfully.
    ユーザー user3 のパスワードを変更しました。
    スクリプトの実行が完了しました。
```
    
実行できた。
    
 一度ログアウトして、userでログインできるか試す。
    
```bash
    >ssh user1@パブリックIPアドレス
    user1@パブリックIPアドレス's password:
```

ログインできればちゃんとパスワードが変更されている。