2014-10-09 84 views
-1

我有一個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 

我已經閱讀了谷歌和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 2014-10-10 08:38:34

回答

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 

expect代碼,則不應使用echo命令。改爲使用puts。在expect代碼中產生進程的選項將比在外部產生更強大。請注意,expect -c標誌使用雙引號。如果您使用單引號,則bash腳本不會執行任何形式的替換。所以,如果你需要bash變量替換,你應該使用-c標誌的expect的雙引號。

瞭解-c標誌的使用,看看here

如果您還有什麼問題,您可以通過以下方式追加-d調試。

expect -d -c " 
       our code here 
     " 
+0

是的,我敢肯定你是對的,但我必須做錯事,因爲我的例子沒有顯示輸出。 – sam452 2014-10-13 15:56:20

相關問題