POSIX 호환 쉘에서 비밀번호를 요청 하시겠습니까?


17

bash스크립트 에서 비밀번호를 요청하고 싶을 때 다음과 같이합니다.

read -s

...하지만 bashPOSIX 모드로 실행 sh하면 -s옵션이 거부됩니다.

$ read -s
sh: 1: read: Illegal option -s

POSIX 호환 명령으로 입력을 안전하게 요청하려면 어떻게합니까?


1
한 가지 가능한 방법은 SO에이 답변에 설명되어 있습니다 : stackoverflow.com/a/28393320/3691891
ARKADIUSZ Drabczyk

답변:


24
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출력에서 몇 마이크로 초 동안 명확하게 표시 되거나 매개 변수를 가진 모든 명령 호출이 감사되면 일부 감사 로그에 표시 될 수 있습니다.


2
아마도 cat+ heredoc이 printf?
John Kugelman은 Monica

1
@JohnKugelman 여기서 문서는 대부분의 쉘에서 임시 파일로 작성되는 반면 printf는 대부분의 쉘에서 빌드됩니다. 어느 것이 가장 좋은지 잘 모르겠습니다.
Stéphane Chazelas


이전 stty설정 을 저장하고 복원하는 방법을 보여 주셔서 감사합니다 .
Barmar

20

read -sPOSIX에 없습니다. POSIX 호환이 되려면를 사용하십시오 stty -echo. stty그리고 그 echo매개 변수 는 POSIX에 정의되어 있습니다.

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

이것은 POSIX를 준수하는 모든 쉘에서 작동합니다.

출처


7
@ arkadiusz-drabczyk의 의견에서 대답의 요점을 강조 표시 stty echo하려면 사용자가 혼란스러워하고 read PASSWORD섹션 에서 control-C를 누르는 경우 다시 켜기 위해 할 수있는 모든 신호를 포착하는 것이 좋습니다. .
Jeff Schaller

이 글에서 링크 된 답변을 읽거나 스테판의 답변을보십시오
Jeff Schaller

무조건 에코를 설정하지 말고 이전 설정을 저장하고 복원해야합니다. 많은 사람들이 Emacs 쉘 ​​버퍼에서 작업하는데, Emacs가 에코 자체를 수행하고 있기 때문에 일반적으로 에코가 비활성화됩니다. 다른 답변은이 작업을 수행하는 방법을 보여줍니다.
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.