Shell

在符合 POSIX 的 shell 中詢問密碼?

  • April 9, 2022

當我想在腳本中詢問密碼時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

引用自:https://unix.stackexchange.com/questions/222974