从 #!/usr/bin/expect -f 中的变量发送

从 #!/usr/bin/expect -f 中的变量发送

我正在玩 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不涉及环境的麻烦(可能会传递给子进程并由它们读取......)。

相关内容