シェルでのパスワードによるユーザーアカウント作成の自動化
1. 概要
コマンドラインを操作せずに、ユーザー作成プロセスを自動化したい場合があります。
このチュートリアルでは、ユーザー作成プロセスを自動化するための堅牢なシェルスクリプトを作成します。 ほとんどのLinuxディストリビューションに付属している組み込みツールを利用して、チュートリアルのセクションを進めながらスクリプトを作成します。 最終的には、手動または別のプログラムから実行できる堅牢なシェルスクリプトができあがります。
2. 自動化スクリプトの設定
まず、ユーザーがすでに存在するかどうかを確認したり、パスワードが提供されていない場合はデフォルトのパスワードを割り当てたりするなどの検証チェックを実行します。 その後、実際のユーザー作成とパスワード割り当てについていくつかのバリエーションを見ていきます。
2.1. 基本的な使用法
コマンドラインからスクリプトを実行し、 –usernameおよび–password引数を指定します。 検証エラーが発生した場合は、手順を含むスクリプト使用法メッセージが表示されます。 スクリプトが正常に実行されると、ユーザー名とパスワードが出力されます。
スクリプトファイルを作成し、using関数を作成することから始めましょう。
#!/bin/sh
usage() {
printf "create-user [-u|--username] <username>\n"
printf " OPTIONS\n"
printf " -u --username\tusername of the new account (required)\n"
printf " -p --password\tpassword for the new account (optional)\n"
printf " -h --help\tprint this help\n"
exit 1
}
エラーが発生した場合にusage関数を呼び出します。スクリプトにusage関数を含めるのはUNIXおよびLinuxの規則です。
2.2. プロセスコマンドオプション
次に、コマンドオプションを処理する必要があります。
using関数の後に引数を処理してみましょう。
while [ "$#" -gt 0 ]; do
case "$1" in
-u|--username) username="$2" shift ;;
-p|--password) password="$2" shift ;;
-h|--help) usage ;;
*) usage ;;
esac
shift
done
[ -z "$username" ] && usage
[ -z "$password" ] && password=$(uuidgen | cut -d'-' -f1)
ユーザー名が指定されていない場合は、スクリプトの使用法を出力し、終了コード1でプログラムを終了します。 パスワードが見つからない場合は、UUIDを生成するuuidgenコマンドを使用しました。 この場合、デフォルトのパスワードには、生成されたUUIDの最初の8文字のみが必要です。
2.3. ユーザーが存在するかどうかを確認する
username引数と同じユーザー名の既存のユーザーがいる可能性があります。 したがって、事前にユーザーデータベース内の既存のユーザーを確認する必要があります。 userdbctlコマンドを使用できます。 userdbctlコマンドを使用して、Linuxマシン上のユーザーデータベースにクエリを実行します。
userdbctlコマンドは、ユーザーデータベースに存在しないユーザーに対して終了コード1を返します。 それ以外の場合は、0を返します。
userdbctl user "$username" > /dev/null 2>&1
[ "$?" -eq 0 ] && echo "$username already exists" && exit 2
上記のスニペットでは、 userdbctl コマンドを実行し、返される終了コードを確認します。
もちろん、ユーザーがすでに存在する場合は useradd コマンドが失敗するため、この安全性チェックをそのままにしておくことができます。 ただし、 useradd は、既存のユーザー名に対して終了コード9を返すため、スクリプトに適した簡単なフィードバックが必要です。
3. ユーザーの作成とパスワードの割り当て
事前チェックが完了したので、実際のユーザーの作成に移ります。 ユーザーの作成には、useraddコマンドを使用します。 パスワードを割り当てるために、いくつかのバリエーションを示します。
3.1. useraddと-pオプション
useradd コマンドは、指定されたユーザー名でユーザーを作成します。 useraddコマンドに-pまたは–passwordオプションを指定して、パスワードを使用してユーザーを作成することもできます:
$ useradd -m newuser -p strongpassword
$ userdbctl user newuser
User name: newuser
Disposition: regular
Login OK: yes
Password OK: yes
UID: 1004
GID: 1004 (newuser)
Directory: /home/newuser
Storage: classic
Shell: /bin/bash
Passwords: none
-m フラグは、ユーザーのホームディレクトリを作成します。 スクリプトで上記のコマンドを使用して、usernameおよびpassword変数を指定してみましょう。
useradd -m "$username" -p "$password" > /dev/null 2>&1
3.2. useradd 、 echo 、およびpasswdコマンド
passwdコマンドは、既存のユーザーアカウントのパスワードを作成または変更します。 引数としてユーザー名を取り、パスワード変更のためのインタラクティブなプロンプトを表示します。
作成したnewuserのパスワードを変更してみましょう。
$ passwd newuser
Changing password for newuser.
Current password:
New password:
Retype new password:
passwd: password updated successfully
ご覧のとおり、passwdコマンドはインタラクティブなプロンプトを表示します。 そのため、echoコマンドをpasswdと一緒に使用して、インタラクティブプロンプトをスキップします。
echo コマンドは、標準入力から入力を受け取り、それを標準出力に出力するユーティリティです。 エコーを他のコマンドとパイプして、プロンプトと確認メッセージをバイパスすることもできます。 したがって、シェルスクリプトまたはLinuxターミナルのいずれかでプロンプトを含むタスクを簡単に自動化できます。
実際の動作を見てみましょう。
$ echo -en "strongpassword\nnewpass\nnewpass\n" | passwd newuser
Changing password for newuser.
Current password:
New password:
Retype new password:
passwd: password updated successfully
何が起こったのか:
- -e フラグを使用して、エスケープシーケンス文字のechoコマンドのサポートを有効にしました。
- -n フラグは、末尾の改行の印刷を無効にします
- 現在のパスワードに続いて、新しい確認済みのパスワードをechoします。
- 各パスワードは「\n」文字で区切られているため、3つの別個の標準入力として扱われます。
- echo コマンドからの出力は、newuserのパスワードを変更するために使用したpasswdコマンドにパイプされます。
echo を使用してプロンプトをバイパスする方法がわかったので、 useradd コマンドにパスワードを指定する代わりに、スクリプトにこれを実装できます。
useradd -m "$username" > /dev/null 2>&1
echo -n "$password\n$password\n" | passwd "$username" /dev/null 2>&1
3.3. useradd 、 echo 、およびchpasswdコマンド
または、 chpasswd コマンドを使用して、新しいユーザーのパスワードを変更することもできます。 passwdと同じ機能を実行します。
実際の動作を見てみましょう。
$ chpasswd
newuser:secretpasscode
passwd と同様に、chpasswdはインタラクティブな複数行のプロンプトを表示します。 ユーザー名の後にコロン(:)と新しいパスワードを入力します。 その後、CTRL+Dを押して変更を適用できます。 passwd と同様に、echoコマンドを使用してこのプロセスを自動化することもできます。
$ echo "newuser:code7654" | chpasswd
chpasswd に慣れてきたので、スクリプトでpasswdの代わりに使用できます。
useradd -m "$username"
echo "${username}:${password}" | chpasswd
4. 仕上げ
スクリプトはほぼ完成しています。 次に、ユーザーが正常に作成されたことをユーザーに知らせるフィードバックコードを作成する必要があります。
スクリプトで実行された最新のコマンドの終了コードを確認します。使用されているバリエーションに応じて、useradd、passwd、chpasswdのいずれかになります:
if [ "$?" -eq 0 ]; then
echo "Username: $username"
echo "Password: $password"
else
echo "Failed to set up user account"
userdel -f "$username"
fi
それを分解しましょう:
- 以前に実行されたコマンドの終了コードを確認し、0に等しいことを期待します
- 通常は成功を示す0の場合、ユーザー名とパスワードを出力します
- 失敗した場合は、失敗メッセージを印刷し、 userdel コマンドが作成されている場合は、それを使用してユーザーをユーザーデータベースから削除します。
- -f フラグは、 userdel に、ユーザーがまだログインしている場合でも、ホームディレクトリとメールスプールとともにユーザーを強制的に削除します。
これで、スクリプトをテストする準備が整いました。
$ ./create-user -u "johndoe" -p "ys2b7444"
Username: johndoe
Password: ys2b7444
$ ./create-user -u "doejohn"
Username: doejohn
Password: 89c871de
$ ./create-user -u johndoe
johndoe already exists
$ ./create-user
create-user [-u|--username] <username>
OPTIONS
-u --username username of the new account (required)
-p --password password for the new account (optional)
-h --help print this help
これで、create-userスクリプトが完成しました。
#!/bin/sh
usage() {
printf "create-user [-u|--username] <username>\n"
printf " OPTIONS\n"
printf " -u --username\tusername of the new account (required)\n"
printf " -p --password\tpassword for the new account (optional)\n"
printf " -h --help\tprint this help\n"
exit 1
}
while [ "$#" -gt 0 ]; do
case "$1" in
-u|--username) username="$2" shift ;;
-p|--password) password="$2" shift ;;
-h|--help) usage ;;
*) usage ;;
esac
shift
done
[ -z "$username" ] && usage
[ -z "$password" ] && password=$(uuidgen | cut -d'-' -f1)
useradd -m "$username" -p "$password" > /dev/null 2>&1
#------------#
# VARIATIONS #
#------------#
# useradd -m "$username"
# echo -n "$password\n$password\n" | passwd $username"
# echo "${username}:${password}" | chpasswd
if [ "$?" -eq 0 ]; then
echo "Username: $username"
echo "Password: $password"
else
echo "Failed to set up user account"
userdel -f "$username"
fi
5. 結論
この記事では、ユーザーの作成プロセスを自動化する方法を説明しました。 この記事全体を通して、ターミナルまたは別のプログラムからユーザーを作成するために使用できる堅牢なシェルスクリプトを作成しました。 スクリプトでは、ユーザーの作成、ユーザーへのパスワードの割り当て、およびユーザーデータベースのクエリにさまざまなツールを使用しました。