stdin
Bash 스크립트의 변수에서 비밀번호를 읽으려고 합니다. 그런 다음 이 변수를 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"