2014-10-09 4 views
-1

У меня есть сценарий bash, который получает информацию от Heroku, чтобы я мог вытащить копию моей базы данных. Этот скрипт отлично работает в cygwin. Но для запуска его в cron он останавливается, потому что оболочка, которая использует остановки, как аутентификация Heroku через Heroku Toolbelt.Ожидание не удается, но я не понимаю, почему

Вот мой кронтаб:

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

Я прочитал Googles и страницу человека внутри Cygwin, чтобы придумать с этим дополнением:

#!/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, так как он ap груши его ждут. Я сделал так много экспериментов с полномочиями и ожиданиями. Все останавливается здесь. Я видел несколько примеров и пытался попробовать их, но я получаю нечеткие взгляды, поэтому я публикую здесь. Что я не понимаю?

Благодаря комментариям, я напомнил явно кладу ENV переменные в .bashrc:

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

Мой Исправленный скрипт на @ отличный пример Динеша ниже:

. /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 работает вне закрытия ожидания, но результаты выше. Результат команды непосредственно выше:

/usr/bin/bash 

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

Что я делаю неправильно, что покажет мне диагностические заметки?

+0

Являются ли переменные окружения 'HEROKU_LOGIN' и' HEROKU_PW' объявленными в вашем файле '.bashrc'? – Dinesh

ответ

0

Если вы собираетесь использовать код expect внутри своего сценария bash, вместо того, чтобы называть его отдельно, тогда вы должны использовать опцию флага -c.

Из вашего кода я предполагаю, что вы указали переменные окружения HEROKU_LOGIN и HEROKU_PW, указанные в файле bashrc.

#!/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 
     " 
+0

Да, я уверен, что вы правы, но я должен делать что-то неправильно, так как я не показываю выход из вашего примера. – sam452

Смежные вопросы