web-dev-qa-db-ja.com

POSIX準拠のシェルでパスワードを要求しますか?

bashスクリプトでパスワードを要求する場合は、次のようにします。

read -s

...しかし、POSIXモードでbashを実行すると、sh-sオプションは拒否されました:

$ read -s
sh: 1: read: Illegal option -s

POSIX準拠のコマンドで入力を安全に要求するにはどうすればよいですか?

17
Hey
read_password() {
  REPLY="$(
    # always read from the tty even when redirected:
    exec < /dev/tty || exit # || exit only needed for bash

    # save current tty settings:
    tty_settings=$(stty -g) || exit

    # schedule restore of the settings on exit of that subshell
    # or on receiving SIGINT or SIGTERM:
    trap 'stty "$tty_settings"' EXIT INT TERM

    # disable terminal local echo
    stty -echo || exit

    # Prompt on tty
    printf "Password: " > /dev/tty

    # read password as one line, record exit status
    IFS= read -r password; ret=$?

    # display a newline to visually acknowledge the entered password
    echo > /dev/tty

    # return the password for $REPLY
    printf '%s\n' "$password"
    exit "$ret"
  )"
}

printfが組み込まれていないシェル(mksh)の場合、ps出力にパスワードが明確に表示され(数マイクロ秒)、すべての監査ログに表示される場合があります。パラメータ付きのコマンド呼び出しが監査されます。

24

read -sはPOSIXにはありません。 POSIXに準拠したい場合は、stty -echosttyおよびそのechoパラメータ はPOSIXで定義されています。

#!/bin/bash
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"

これは、POSIXに準拠するすべてのシェルで機能します。

ソース

20
serenesat