回答:
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
出力にクリアに表示される(数マイクロ秒)か、パラメーターを使用したすべてのコマンド呼び出しが監査されると、一部の監査ログに表示される場合があります。
cat
+ヒアドキュメントは、より安全な代替ことprintf
?
REPLY="$(...)"
(SEシンタックスハイライトを除く)害をしませんが、必要ではない
stty
設定を保存および復元する方法を示してくれてありがとう。
read -s
POSIXにはありません。POSIX準拠にしたい場合は、を使用してくださいstty -echo
。stty
およびそのecho
パラメーターはPOSIXで定義されています。
#!/bin/bash
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
これは、POSIXに準拠するすべてのシェルで機能します。
stty echo
には、read PASSWORD
セクション中にユーザーが混乱してcontrol-Cを押した場合に有効にするために、できる限りすべてのシグナルをトラップすることをお勧めします。