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.