期待失败,但我不明白为什么

时间:2014-10-09 20:38:00

标签: bash heroku cron cygwin expect

我有一个bash脚本从Heroku获取信息,以便我可以提取数据库的副本。该脚本在cygwin中运行良好。但是要在cron中运行它会暂停,因为它使用的shell会通过Heroku Toolbelt停止作为Heroku的身份验证。

这是我的crontab:

SHELL=/usr/bin/bash
5 8-18 * * 1-5 /cygdrive/c/Users/sam/work/push_db.sh >>/cygdrive/c/Users/sam/work/output.txt

我已经阅读了谷歌中的谷歌和手册页来提出这个补充:

#!/usr/bin/bash
. /home/sam.walton/.profile
echo $SHELL
curl -H "Accept: application/vnd.heroku+json; version=3" -n https://api.heroku.com/
#. $HOME/.bash_profile
echo `heroku.bat pgbackups:capture --expire`
#spawn heroku.bat pgbackups:capture --expire
expect {
  "Email:" { send -- "$($HEROKU_LOGIN)\r"}
  "Password (typing will be hidden):" { send -- "$HEROKU_PW\r" }
  timeout  { echo "timed out during login"; exit 1 }
}
 sleep 2
 echo "first"
 curl -o latest.dump -L "$(heroku.bat pgbackups:url | dos2unix)"

这是output.txt的输出

/usr/bin/bash
{
  "links":[
    {
      "rel":"schema",
      "href":"https://api.heroku.com/schema"
    }
  ]
}
Enter your Heroku credentials. Email: Password (typing will be hidden): Authentication failed. Enter your Heroku credentials. Email: Password (typing will be hidden): Authentication failed. Enter your Heroku credentials. Email: Password (typing will be hidden): Authentication failed.

正如您所看到的那样,输出似乎没有得到send命令的结果,因为它看起来正在等待。我用凭证和期望陈述做了很多实验。一切都停在这里。我已经看过很少的例子,并试图尝试这些,但我模糊的眼睛,这就是我在这里张贴的原因。我不理解的是什么?

感谢评论,我提醒我明确将我的env变量放在.bashrc中:

[[ -s $USERPROFILE/.pik/.pikrc ]] && source "$USERPROFILE/.pik/.pikrc"
export HEROKU_LOGIN=myEmailHere
export HEROKU_PW=myPWhere

根据@ Dinesh的优秀示例,我修改过的脚本如下:

. /home/sam.walton/.bashrc echo $SHELL echo $HEROKU_LOGIN curl -H "Accept: application/vnd.heroku+json; version=3" -n https://api.heroku.com/

expect -d -c "   spawn heroku.bat pgbackups:capture --expire --app gw-inspector   expect {
    "Email:" { send -- "myEmailHere\r"; exp_continue}
    "Password (typing will be hidden):" { send -- "myPWhere\r" }
    timeout  { puts "timed out during login"; exit 1 }   } " sleep 2 echo "first"

这应该可以工作,但是当变量的回显失败时,给我一个变量未被调用的线索,我正在测试直接硬编码变量以将其作为变量消除。但是你可以通过我的输出看到回声不仅没有产生,没有任何诊断被传递的线索,这让我想知道脚本是否被调用从期望运行,以及产生的结果命令。要重述,heroku.bat命令在expect闭包之外工作,但结果在上面。上面命令的结果是:

/usr/bin/bash

{
  "links":[
    {
      "rel":"schema",
      "href":"https://api.heroku.com/schema"
    }
  ]
} 

我做错了什么会给我看诊断笔记?

1 个答案:

答案 0 :(得分:0)

如果您打算在bash脚本中使用expect代码,而不是单独调用它,那么您应该使用-c标志选项。

从您的代码中,我假设您在bashrc文件中声明了环境变量HEROKU_LOGIN和HEROKU_PW。

#!/usr/bin/bash

#Your code here

expect -c "
           spawn <your-executable-process-here>
           expect {
                    # HEROKU_LOGIN & HEROKU_PW will be replaced with variable values.

                   "Email:"   { send -- "$HEROKU_LOGIN\r";exp_continue}
                   "Password (typing will be hidden):" { send "$HEROKU_PW\r" }
                    timeout  { puts"timed out during login"; exit 1 }
           }
 "
 #Your further bash code here

您不应在echo代码中使用expect命令。请改用puts。在expect代码中生成进程的选项将比在外部生成进程更加强大。

请注意使用带有expect -c标志的双引号。如果你使用单引号,那么bash脚本不会做任何形式的替换。因此,如果您需要bash变量替换,则应使用带有expect标记的-c的双引号。

要了解-c标志的使用情况,请查看here

如果您仍有任何问题,可以通过以下方式附加-d进行调试。

expect -d -c "
              our code here
       "