에코하지 않고 쉘 스크립트에서 비밀번호를 얻는 방법
암호로 보호 된 시스템에 액세스해야하는 프로세스를 자동화하는 스크립트가 있습니다. 시스템은 사용자 비밀번호를 인수로 허용하는 명령 행 프로그램을 통해 액세스됩니다.
사용자에게 암호를 입력하고 셸 변수에 할당 한 다음 해당 변수를 사용하여 액세스 프로그램의 명령 줄을 구성하도록 요청하고 싶습니다 (물론 처리 할 스트림 출력을 생성합니다).
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)
이 링크는 * 비밀번호를 터미널로 다시 에코하지 않고 사용에서 비밀번호를 읽는 방법 * 각 문자를 * 문자로 바꾸는 방법을 정의하는 데 도움이됩니다.
https://www.tutorialkart.com/bash-shell-scripting/bash-read-username-and-password/
우선, 누군가가 파일에 암호를 저장하려는 경우 해시인지 확인합니다. 최상의 보안은 아니지만 최소한 일반 텍스트는 아닙니다.
먼저 비밀번호를 작성하고 해시하십시오.
echo "password123" | md5sum | cut -d '-' -f 1 > /tmp/secret
이제 해시를 사용하도록 프로그램을 작성하십시오. 이 경우이 작은 프로그램은 에코없이 암호에 대한 사용자 입력을 수신 한 후 저장된 해시와 비교하기 위해 해시로 변환합니다. 저장된 해시와 일치하면 액세스 권한이 부여됩니다.
#!/bin/bash PASSWORD_FILE="/tmp/secret" MD5_HASH=$(cat /tmp/secret) PASSWORD_WRONG=1 while [ $PASSWORD_WRONG -eq 1 ] do echo "Enter your password:" read -s ENTERED_PASSWORD if [ "$MD5_HASH" != "$(echo $ENTERED_PASSWORD | md5sum | cut -d '-' -f 1)" ]; then echo "Access Deniend: Incorrenct password!. Try again" else echo "Access Granted" PASSWORD_WRONG=0 fi done
'development' 카테고리의 다른 글
안드로이드 텍스트보기 텍스트를 정당화 (0) | 2020.02.26 |
---|---|
Windows 배치 스크립트 (.bat)에서 전달 된 인수 목록 가져 오기 (0) | 2020.02.26 |
Maven이 실행할 JUnit 테스트를 찾지 못함 (0) | 2020.02.26 |
Android에서 '앱이 설치되지 않았습니다'오류 (0) | 2020.02.26 |
Java 가져 오기 명령문에 와일드 카드를 사용하는 이유가 무엇입니까? (0) | 2020.02.26 |