2013-01-18 78 views
12

我有一個shell調配腳本調用需要用戶輸入的命令 - 但是當我運行vagrant provision時,該進程在腳本中的該點處掛起,因爲該命令正在等待我的輸入,但無處可給。有沒有辦法解決這個問題 - 即強制腳本以某種交互模式運行?如何與Vagrant shell配置腳本進行交互?

的細節是我創造一個乾淨的Ubuntu虛擬機,然後調用Heroku的CLI下載數據庫備份(這是我的配置腳本):

curl -o /tmp/db.backup `heroku pgbackups:url -a myapp` 

然而,因爲這是一個乾淨的虛擬機,因此這是我第一次運行Heroku CLI命令,系統提示輸入我的登錄憑據。由於該腳本由Vagrant管理,因此不存在交互式外殼,因此該腳本只是掛在那裏。

+0

你的解決方案是什麼? – Mathieu

回答

2

我假設你不想以純文本硬編碼你的憑證,從而試圖強制交互模式。 事情就像你我在流浪漢提供文檔(http://docs.vagrantup.com/v1/docs/provisioners/shell.html)中看不到這樣的選項,所以你需要在腳本中嵌入認證。 你有沒有想過使用類似獲取令牌並使用heroku REST Api而不是CLI? https://devcenter.heroku.com/articles/authentication

+2

你是對的 - 我爲一羣開發人員構建了一個通用盒子,他們都需要提供自己的憑證。現在我已經解決了這個問題。 –

+11

你是怎麼解決它的? –

+0

@JoeBlock你可以通過使用用戶輸入數據的配置文件來解決它,並預期:http://linux.die.net/man/1/expect – SgtPooki

1

如果你想臨時輸入或變量傳遞給一個流浪者的腳本,你可以讓他們首先將它們放置在同一行上輸入憑據作爲該命令臨時環境變量:

username=x password=x vagrant provision 

並從內部Vagrantfile訪問它們作爲

$u = ENV['username'] 
$p = ENV['password'] 

然後你可以將它們作爲參數傳遞給您的bash腳本:

config.vm.provision "shell" do |s| 
    s.inline: "echo username: $1, password: $2" 
    s.args: [$u, $p] 
end 

您可以在vm中安裝類似expect的東西來處理將這些變量傳遞給curl命令。