我正在编写expect脚本来启动SSH隧道。
实例启动时,它将在EC2上运行,作为从.ebextensions配置文件创建脚本的部署的一部分。
运行脚本时,它总是会在此时卡住:Enter passphrase for key '/home/ec2-user/id_data_app_rsa':
如果我在服务器上手动运行相同的脚本,它将成功,并且可以看到隧道进程正在运行。ps aux | grep sshroot 19046 0.0 0.0 73660 1068 ? Ss 16:58 0:00 ssh -i /home/ec2-user/id_data_app_rsa -p222 -vfN -L 3306:X.X.X.X:3306 root@X.X.X.X
我可以通过将脚本打印到控制台来验证脚本是否正确读取了SSH_PASSPHRASE。
set password $::env(SSH_PASSPHRASE)
send_user "retrieved env variable : $password "
这是我从EC2日志中获得的调试输出:
Enter passphrase for key '/home/ec2-user/id_data_app_rsa':
interact: received eof from spawn_id exp0
我对为什么EC2部署程序在运行时无法在此继续前进感到困惑,但是在手动运行时它仍然可以正常运行。
这是
.ebextensions中的脚本,脚本本身以
#!/usr/bin/expect开始:
files:
"/scripts/createTunnel.sh" :
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/expect
exp_internal 1
set timeout 60
# set variables
set password $::env(SSH_PASSPHRASE)
send_user "retrieved env variable : $password "
spawn -ignore HUP ssh -i /home/ec2-user/id_data_app_rsa -p222 -vfN -L 3306:X.X.X.X:3306 root@X.X.X.X
expect {
"(yes/no)?" { send "yes\n" }
-re "(.*)assphrase" { sleep 1; send -- "$password\n" }
-re "(.*)data_app_rsa" { sleep 1; send -- "$password\n" }
-re "(.*)assword:" { sleep 1; send -- "$password\n" }
timeout { send_user "un-able to login: timeout\n"; return }
"denied" { send_user "\nFatal Error: denied \n"}
eof { send_user "Closed\n" ; return }
}
interact
请您参考如下方法:
我们终于解决了。似乎有两件事是有问题的:
interact更改为expect eof。 expect模式尽可能地匹配。 我们在测试中注意到,期望值似乎匹配不正确,例如,在应该按“是/否”提示发送"is"匹配项时发送密码。
这是我们最终得到的最终脚本,以防它对其他人有用:
#!/usr/bin/expect
exp_internal 1
set timeout 60
# set variables
set password $::env(SSH_TUNNEL_PASSPHRASE)
spawn -ignore HUP ssh -i /home/ec2-user/id_data_rsa -p222 -vfN -L 3306:X.X.X.X:3306 root@X.X.X.X
expect {
"(yes/no)?" { send "yes\r" }
"Enter passphrase" { sleep 2; send -- "$password\r"; sleep 2; exit }
}
expect eof




