0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Shell: パスワード入力コード例(Linux)

Posted at

概要

あまり流行らないのですが、パスワード生成やパスワード入力がまれに必要になるので、メモ。

パスワード生成

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
    
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?