我正在玩 overthewire.org/wargames/bandit1。我从 bandit0 获得了密码自述文件,但我不想输入 32 个字符的密码来访问 ssh 到 bandit 1。我想自动传递密码。
我下载了密码文件,然后使用 nano 将“pass=”添加到字符串的开头。所以从那以后,我可以这样做:
root@system:~/# source /root/Downloads/readme; export pass; echo $pass
<passwordText>
然后我根据这里提出的另一个问题编写了这个脚本(答案2https://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 变量,它与 shell 变量或其与作为环境传递的字符串不幸的重叠没有任何关系(请参阅手册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
不涉及环境的麻烦(可能会传递给子进程并由它们读取......)。