スクリプトからパスワードを要求するには、bash
次の手順を実行します。
read -s
...しかし、bash
POSIXモードで実行するときは、以下を使用してください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 -s
POSIXにはありません。 POSIXに準拠するにはstty -echo
。stty
そしてそのecho
パラメータPOSIXで定義されています。
#!/bin/bash
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
これはすべてのPOSIX互換シェルに適用されます。