저는 overthewire.org/wargames/bandit1을 플레이하고 있습니다. bandit0으로부터 비밀번호 readme를 받았지만 bandit 1에 ssh에 접속하기 위해 32자의 비밀번호를 입력하고 싶지 않습니다. 비밀번호를 자동으로 전달하고 싶습니다.
비밀번호 파일을 다운로드하고 nano를 사용하여 문자열 시작 부분에 "pass="를 추가했습니다. 그러면 그때부터 다음과 같이 할 수 있습니다.
root@system:~/# source /root/Downloads/readme; export pass; echo $pass
<passwordText>
그런 다음 여기에 질문된 또 다른 질문(답변 2)을 바탕으로 이 스크립트를 작성했습니다.https://stackoverflow.com/questions/16928004/how-to-enter-ssh-password-using-bash)
#!/usr/bin/expect -f
spawn ssh [email protected] -p 2220 -l bandit1
expect "assword:"
send $pass
interact
그런 다음 스크립트 파일을 저장하고 chmod u+x한 후 실행합니다. 출력에는 변수를 읽을 수 없다고 표시됩니다.
password: can't read "pass": no such variable
while executing
"send $pass"
(file "./bandit1" line 4)
스크립트가 변수의 비밀번호를 올바르게 에코하기 때문에 헤더와 관련이 있다는 것을 알고 있습니다.
#!/usr/bin/env bash
export pass=""
source /root/Downloads/readme
export pass
echo $pass
하지만 bash 스크립트 헤더에 대한 구체적인 정보를 찾을 수 없습니다. 누군가 내가 이것을 명확히하도록 도와 줄 수 있습니까?
답변1
$pass
스크립트에 사용되는 것은 expect
TCL 변수입니다. 이는 쉘 변수와 관련이 없거나 불행하게도 환경으로 전달된 문자열과 겹칩니다(맨 environ(7)
페이지 참조). TCL에서는 변수를 통해 환경에 액세스할 수 있습니다 env
( tclvars(n)
맨 페이지 참조). 그래서,
$ cat envtest
#!/usr/bin/env expect
puts $env(pass)
set pass $env(pass)
puts $pass
$ chmod +x envtest
$ export pass=Hunter2
$ ./envtest
Hunter2
Hunter2
$
따라서 expect
코드는 다음과 같이 작성할 수 있습니다.
#!/usr/bin/expect -f
spawn ssh [email protected] -p 2220 -l bandit1
expect "assword:"
send $env(pass)
interact
pass
환경 문자열 에 대한 직접 액세스 (중복 환경 변수가 생성되는 것을 막을 수 있는 방법이 많지 않기 때문에 어쨌든 그 중 하나입니다...)
게다가비밀번호를 처리하는 다양한 방법expect
환경이 번거롭지 않습니다(아마도 하위 프로세스에 전달되어 읽혀질 것입니다...).