Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在EC2上运行expect脚本会挂起,但在手动调用时会成功运行_Amazon Web Services_Ssh_Amazon Ec2_Expect - Fatal编程技术网

Amazon web services 在EC2上运行expect脚本会挂起,但在手动调用时会成功运行

Amazon web services 在EC2上运行expect脚本会挂起,但在手动调用时会成功运行,amazon-web-services,ssh,amazon-ec2,expect,Amazon Web Services,Ssh,Amazon Ec2,Expect,我正在编写一个expect脚本来启动SSH隧道 当实例启动时,它在EC2上运行,作为部署的一部分,该部署从.ebextensions配置文件创建脚本 当脚本运行时,它总是在这一点上卡住: 输入密钥“/home/ec2 user/id\u data\u app\u rsa”的密码短语: 如果我在服务器上手动运行相同的脚本,它会成功,并且我可以看到隧道进程正在运行 ps aux|grep ssh root 19046 0.0 0.0 73660 1068?ssh-i/home/ec2 user/id

我正在编写一个
expect
脚本来启动SSH隧道

当实例启动时,它在EC2上运行,作为部署的一部分,该部署从
.ebextensions
配置文件创建脚本

当脚本运行时,它总是在这一点上卡住:

输入密钥“/home/ec2 user/id\u data\u app\u rsa”的密码短语:

如果我在服务器上手动运行相同的脚本,它会成功,并且我可以看到隧道进程正在运行

ps aux|grep ssh

root 19046 0.0 0.0 73660 1068?ssh-i/home/ec2 user/id\u data\u app\u rsa-p222-vfN-L 3306:X.X.X:3306root@X.X.X.X

我可以通过将脚本打印到控制台来验证脚本是否正确读取了
SSH\u密码短语

   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
你的问题是:

set password $::env(SSH_PASSPHRASE)
以及shell处理环境变量的方式。当调用脚本时,您假定已设置环境变量。根据脚本的调用方式,可能不会设置$::env(SSH\u密码短语),从而导致变量为null/blank。当运行init脚本(或cloudinit)时,它们不会在登录shell的环境中运行。因此,您不应该假设设置了.profile或/etc/profile环境变量,而应该显式地对它们进行源或设置

一个可能的解决办法可能是

. ~ec2-user/.profile /path/to/above.script

我们终于解决了这个问题。有两件事似乎有争议:

  • 将最终的
    交互
    更改为
    预期eof
  • 削减开支
    尽可能期望模式匹配
在测试中,我们注意到expect似乎匹配错误,例如,当它应该在“是/否”提示下发送“是”匹配时,发送一个密码

这是我们最后的脚本,以防对其他人有用:

     #!/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

在脚本开头添加
exp_internal 1
,以获取更多调试信息。现在开始测试,但不幸的是,这似乎不是问题所在。我可以将环境变量的值打印到控制台,并查看脚本是否正确地提取了该值。即使失败,密码的值是否正确?CR/LF和NULL?密码值正确。我不知道你的第二个问题是什么意思:“CR/LF和nulls?”