概要
あまり流行らないのですが、パスワード生成やパスワード入力がまれに必要になるので、メモ。
パスワード生成
pwgen
がランダム生成よりは使いやすい。
$ pwgen --symbols 12 4
ohN&a}cohh5n sa@u3Toom.u2 seiT<ahxaef2 Zoe9bei^vieP
特定の文字種が2文字以上や禁止文字があるなど要件が合わない場合は、次のやり方がある。前者のアプローチのほうが難易度が低い。
- 複数個パスワードを生成して要件に満たないパスワードを除外する
- 要件に合う文字種と文字数を満たすように生成し、要件を満たしたらランダムに埋めて、最後にシャッフルする
パスワード入力(汎用)
-
パスワード入力(入力誤りのチェックなし)
#!/bin/bash read -s -p "Password: " NEW_PASSWORD echo if [ -z "$NEW_PASSWORD" ]; then echo "ERROR: You have not entered your password. Stop processing." 1>&2 exit 1 fi echo "PASS: $NEW_PASSWORD"
-
パスワードのタイプミスを検出する
#!/bin/bash NEW_PASSWORD= while read -s -p "Password: " NEW_PASSWORD; do echo "" read -s -p "Re-type new password: " CONFIRM_PASSWORD; test "${NEW_PASSWORD}" = "${CONFIRM_PASSWORD}" && { echo; break; } echo "ERROR: password verification error" done
パスワード入力(htpasswd)
仕様メモ
-
パスワードファイルには複数のユーザーのパスワードを格納できる
-
複数ユーザーを格納できるが
htpasswd
コマンドでユーザーが登録済みかを確認する方法は分からず- やるにしてもverifyで適当なパスワードを指定して確認する…ぐらい
-
1ユーザーに限る場合は、パスワードファイルの存在有無で管理したほうが論理を簡略化できる
- ユーザー作成時は、
-c
で新規作成する - ユーザー削除時は、パスワードファイル自体を破棄する
- ユーザー作成時は、
-
パスワードファイルは空で作ったほうが論理はスッキリする
- パスワードファイルがない状態で、パスワード入力を間違えると空ファイルを作る動作となる
実装例
-
対話入力
#!/bin/bash test $# -eq 2 || { echo "ERROR: Invalid argument. : ARG-NUM=$#"; exit 1; } SUB_COMMAND=$1 HTUSER=$2 HTPASSWD_FILE=".htpasswd" case "${SUB_COMMAND}" in add) test -s ${HTPASSWD_FILE} || touch ${HTPASSWD_FILE} wc -l ${HTPASSWD_FILE} while true; do grep -qE "^${HTUSER}:" ${HTPASSWD_FILE} && { echo "WARNING: User already exists : USER='${HTUSER}'"; break;} (set -x; htpasswd ${HTPASSWD_FILE} ${HTUSER}) && break done wc -l ${HTPASSWD_FILE} ;; delete) (set -x; htpasswd -D ${HTPASSWD_FILE} ${HTUSER}) ;; esac
-
バッチ処理
-i
オプションで標準入力からパスワードを受け取ることができる。#!/bin/bash test $# -ne 1 && { echo "ERROR: Invalid argument. : ARG-NUM=$#"; exit 1; } HTPASSWD_FILE=".htpasswd" case $1 in create) touch ${HTPASSWD_FILE} while read HTUSER; do (set -x; pwgen 12 1 | tee .pass.${HTUSER} | htpasswd -i ${HTPASSWD_FILE} ${HTUSER}) done <<EOF user01 user02 EOF wc -l ${HTPASSWD_FILE} ;; delete) while read HTUSER; do (set -x; htpasswd -D ${HTPASSWD_FILE} ${HTUSER}) done <<EOF user01 user02 EOF ls -l ${HTPASSWD_FILE} rm -f ${HTPASSWD_FILE} ;; esac