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(그러나 결국 영구 저장소에 쓸 수 있는) 또 다른 POSIX 호환 방법은 다음과 같습니다.

cat << EOF
$password
EOF

또한 zsh 또는 bash는 IFS= read -rs 'pass?Password: 'stderr에 대해 IFS= read -rsp 'Password: ' pass프롬프트를 표시합니다. Password:따라서 이러한 경우 2> /dev/tty프롬프트가 제어 터미널로 이동하는지 확인하기 위해 하나를 추가할 수 있습니다.

어떤 경우 에라도,잊지 말고 확인하세요 IFS=.-r.

답변2

read -sPOSIX에는 없습니다. POSIX를 준수하려면 stty -echo.stty그리고 그 echo매개변수POSIX에 정의되어 있습니다.

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

이는 모든 POSIX 호환 쉘에 적용됩니다.

원천

관련 정보