Shell
在符合 POSIX 的 shell 中詢問密碼?
當我想在腳本中詢問密碼時
bash
,我會這樣做:read -s
…但是當我
bash
在 POSIX 模式下執行時sh
,該-s
選項被拒絕:$ read -s sh: 1: read: Illegal option -s
如何使用符合 POSIX 的命令安全地請求輸入?
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
沒有內置的 shell(ksh88、mksh 和大多數其他 pdksh 派生的 shell),密碼將在ps
輸出中清晰顯示(幾微秒),或者如果所有命令呼叫都使用他們的參數被審計。但是,在這些 shell 中,您可以將其替換為print -r -- "$password"
.無論如何
echo
一般都不是一種選擇。另一個不涉及在
ps
輸出中顯示密碼(但可能最終將其寫入永久儲存)的符合 POSIX 標準的方法是:cat << EOF $password EOF