我正在编写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 
    


    评论关闭
    IT序号网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!