암호로 보호 된 시스템에 액세스해야하는 프로세스를 자동화하는 스크립트가 있습니다. 시스템은 사용자 비밀번호를 인수로 허용하는 명령 행 프로그램을 통해 액세스됩니다.
사용자에게 암호를 입력하고 셸 변수에 할당 한 다음 해당 변수를 사용하여 액세스 프로그램의 명령 줄을 구성하도록 요청하고 싶습니다 (물론 처리 할 스트림 출력을 생성합니다).
Bourne / Bash에서 합리적으로 유능한 쉘 프로그래머이지만 터미널에 에코하지 않고 사용자 입력을 받아들이는 방법을 알지 못합니다 (또는 ‘*’문자를 사용하여 에코하는 방법).
누구든지 이것을 도울 수 있습니까?
답변
다른 방법은 다음과 같습니다.
#!/bin/bash
# Read Password
echo -n Password:
read -s password
echo
# Run Command
echo $password
그러면 read -s
에코가 꺼집니다. echo
마지막 줄에서 실행하려는 명령으로 바꾸십시오 .
답변
POSIX 호환 답변. 사용주의 /bin/sh
대신을 /bin/bash
. (bash와 함께 작동하지만 bash가 필요 하지 않습니다 .)
#!/bin/sh
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
답변
짧막 한 농담:
read -s -p "Password: " password
Linux (및 cygwin)에서이 양식은 bash 및 sh에서 작동합니다. 그러나 표준 Unix sh가 아닐 수도 있습니다.
자세한 정보와 옵션을 보려면 bash에 “help read”를 입력하십시오.
$ help read
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
Read a line from the standard input and split it into fields.
...
-p prompt output the string PROMPT without a trailing newline before
attempting to read
...
-s do not echo input coming from a terminal
답변
POSIX 표준 에는 -s
옵션이 read
정의되어 있지 않습니다. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html을 참조 하십시오 . POSIX 셸에서 작동하는 것을 원했기 때문에 stty
에코를 비활성화 하는 데 사용되는 작은 함수를 작성했습니다 .
#!/bin/sh
# Read secret string
read_secret()
{
# Disable echo.
stty -echo
# Set up trap to ensure echo is enabled before exiting if the script
# is terminated while echo is disabled.
trap 'stty echo' EXIT
# Read secret.
read "$@"
# Enable echo.
stty echo
trap - EXIT
# Print a newline because the newline entered by the user after
# entering the passcode is not echoed. This ensures that the
# next line of output begins at a new line.
echo
}
이 기능은 read
명령 과 매우 유사하게 작동합니다 . 다음은 간단한 사용법 read
과 비슷한 사용법입니다 read_secret
. read_secret
터미널에 반향되지 않아서 입력 이 비어있는 것으로 나타납니다.
[susam@cube ~]$ read a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret a b c
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
-r
입력에 백 슬래시를 유지하기 위해 옵션을 사용하는 또 다른 방법이 있습니다. read_secret
위에서 정의한 함수가받는 모든 인수를 read
명령에 전달 하기 때문에 작동합니다 .
[susam@cube ~]$ read -r a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret -r a b c
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
마지막으로, read_secret
함수를 사용하여 POSIX 호환 방식으로 비밀번호를 읽는 방법을 보여주는 예제가 있습니다.
printf "Password: "
read_secret password
# Do something with $password here ...
답변
askpass
유용한 명령으로 나타났습니다
password=$(/lib/cryptsetup/askpass "Give a password")
모든 입력 문자는 *로 대체됩니다. 참조 : 비밀번호 제공 ****
답변
echo
을 사용하여 껐다가 stty
다시 켜십시오 .
답변
다음과 같이함으로써 현재 쉘에서 변수를 설정하지 않고 암호를 요구할 수도 있습니다 :
$(read -s;echo $REPLY)
예를 들어 :
my-command --set password=$(read -sp "Password: ";echo $REPLY)
다음과 같은 프롬프트 값을 줄 바꿈으로 추가 할 수 있습니다.
my-command --set user=$(read -sp "`echo $'\n '`User: ";echo $REPLY) --set password=$(read -sp "`echo $'\n '`Password: ";echo $REPLY)