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

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

スクリプトからパスワードを要求するには、bash次の手順を実行します。

read -s

...しかし、bashPOSIXモードで実行するときは、以下を使用してくださいsh-s

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

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

答え1

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"
  )"
}

組み込まれていないシェル(ksh88、mksh、および他のほとんどのpdksh派生シェル)の場合、printfパスワードはps出力にプレーンテキストで表示されるか(数マイクロ秒間)、すべてのコマンド呼び出しが監査される場合に注意してください。買収。しかし、これらのシェルではこれをprint -r -- "$password"

いずれにせよecho通常はオプションではありません。

出力でパスワードを公開しないps(しかし最終的に永続ストアに書き込むことができる)もう1つのPOSIX準拠の方法は次のとおりです。

cat << EOF
$password
EOF

また、zsh または bash はIFS= read -rs 'pass?Password: 'stderr のプロンプトをIFS= read -rsp 'Password: ' pass表示します。Password:したがって、この場合、2> /dev/ttyプロンプトが制御端末に移動することを確認するために1つを追加できます。

いずれにせよ、忘れずに確認してくださいIFS=-r

答え2

read -sPOSIXにはありません。 POSIXに準拠するにはstty -echosttyそしてそのechoパラメータPOSIXで定義されています。

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

これはすべてのPOSIX互換シェルに適用されます。

源泉

関連情報