我有一个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"
}
]
}
我做错了什么会给我看诊断笔记?
答案 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
"