development

에코하지 않고 쉘 스크립트에서 비밀번호를 얻는 방법

big-blog 2020. 2. 26. 07:57
반응형

에코하지 않고 쉘 스크립트에서 비밀번호를 얻는 방법


암호로 보호 된 시스템에 액세스해야하는 프로세스를 자동화하는 스크립트가 있습니다. 시스템은 사용자 비밀번호를 인수로 허용하는 명령 행 프로그램을 통해 액세스됩니다.

사용자에게 암호를 입력하고 셸 변수에 할당 한 다음 해당 변수를 사용하여 액세스 프로그램의 명령 줄을 구성하도록 요청하고 싶습니다 (물론 처리 할 스트림 출력을 생성합니다).

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/


우선, 누군가가 파일에 암호를 저장하려는 경우 해시인지 확인합니다. 최상의 보안은 아니지만 최소한 일반 텍스트는 아닙니다.

  1. 먼저 비밀번호를 작성하고 해시하십시오.

    echo "password123" | md5sum  | cut -d '-' -f 1 > /tmp/secret
    
  2. 이제 해시를 사용하도록 프로그램을 작성하십시오. 이 경우이 작은 프로그램은 에코없이 암호에 대한 사용자 입력을 수신 한 후 저장된 해시와 비교하기 위해 해시로 변환합니다. 저장된 해시와 일치하면 액세스 권한이 부여됩니다.

    #!/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
    

참고 URL : https://stackoverflow.com/questions/3980668/how-to-get-a-password-from-a-shell-script-without-echoing



반응형