$!@`'와 같은 특수 문자가 포함된 비밀번호를 Bash 스크립트로 읽는 모범 사례

$!@`'와 같은 특수 문자가 포함된 비밀번호를 Bash 스크립트로 읽는 모범 사례

stdinBash 스크립트의 변수에서 비밀번호를 읽으려고 합니다. 그런 다음 이 변수를 ssh 명령으로 확장하여 서버로 전송해야 합니다. 여기에서 비밀번호는 적절하게 이스케이프된 방식으로 도착해야 다른 명령에 대한 입력으로 사용될 수 있습니다. (이 경우 내 pihole의 로그인 비밀번호를 변경합니다).

현재 나는 다음과 같은 것을 가지고 있습니다 :

read -rs -p "Password: `echo $'\n> '`" newpass
ssh root@gate "pihole -a -p \"${newpass}\""

하지만 다음과 같은 시도도 했습니다.

ssh root@gate "pihole -a -p ""'""${newpass}""'"
ssh root@gate 'pihole -a -p '"${newpass}"
ssh root@gate 'pihole -a -p '"${newpass}"''
ssh root@gate "pihole -a -p \'${newpass}\'"
ssh root@gate 'pihole -a -p ''\''"${newpass}"'\''

printf를 사용해도:

IFS= read -rs -p "Password: `echo $'\n> '`" newpass
command=$(printf 'pihole -a -p %s\n' "$newpass")

또는

IFS= read -rs -p "Password: `echo $'\n> '`" newpass
command=$(printf 'pihole -a -p '\''%s'\''\n' "$newpass")

더 많은 것이 있습니다. 하지만 이 코드를 사용하면 a$#5!6k?h'v;z'모두 실패했습니다. 그리고 거기에는 백틱도 없습니다…

모든 Bash 전문가에게 내 질문은 다음과 같습니다.

비밀번호를 변수(사용자가 입력할 수 있는 위치)로 구문 분석하는 올바른 방법은 무엇입니까?말 그대로 어떤특징?

여기에는 다음이 포함됩니다.

$ 
!
` (backtick)
' (single quote)
"
;
#
@
\
/
~
\n

등...

여기와 다른 포럼에서 관련 질문을 모두 읽었지만 이 사용 사례에 대한 해결책을 찾을 수 없습니다.

알아요, Python이나 C 같은 것을 사용하자고 제안하는 사람들이 있겠지만, 저는 여전히 Bash가 무엇을 할 수 있는지에 관심이 있습니다.

그러나 이 작업이 Bash를 사용하여 수행하는 것이 절대 불가능하다면 다른 도구를 사용하여 이를 (깨끗하고 안전하게) 수행하는 방법에 대한 아이디어에도 관심이 있습니다.

미리 감사드립니다

답변1

몇 가지 가능한 솔루션.

  • 자신의 프롬프트를 사용하는 대신 pihole이 직접 비밀번호를 묻도록 합니다.

    ssh -t user@host pihole -a -p
    
  • read대상에서 자신만의 프롬프트를 실행하십시오.

    ssh -t user@host 'read -rsp "Password: " newpass && pihole -a -p "$newpass"'
    
  • 다음을 통해 파이프하세요.

    echo "$newpass" | ssh user@host 'read -r newpass && pihole -a -p "$newpass"'
    
  • 비밀번호를 전달하기 전에 읽은 비밀번호를 인용하세요.

    read -rsp "Password: " newpass
    qnewpass=$(printf "%q" "$newpass")
    ssh user@host pihole -a -p "$qnewpass"
    
  • 비밀번호를 인코딩하고 반대편에서 디코딩합니다.

    newpass_base64=$(printf "%s" "$newpass" | base64)
    ssh user@host "pihole -a -p \$(echo $newpass_base64 | base64 -d)"
    
  • 특수 문자를 전혀 사용하지 마세요.XKCD 스타일. ;-)

답변2

$ echo "$pw"
$!@`',

$ echo "${pw@Q}"
'$!@`'\'','

이 작업이 가능해야 합니다. 하지만 bash이것이 어느 버전에 도입되었는지 는 알 수 없습니다 . 이 방법도 작동하며 더 일찍 사용 가능할 수도 있습니다.

$ printf %q "$pw"
\$\!@\`\'\,
# or, avoiding the command substitution
$ printf -v pw_ql1 %q "$pw"
$ echo "$pw_ql1"

관련 정보