15

我有一个 shell 配置脚本,它调用需要用户输入的命令 - 但是当我运行时vagrant provision,进程在脚本中的那个点挂起,因为命令正在等待我的输入,但无处可提供。有什么办法可以解决这个问题 - 即强制脚本以某种交互模式运行?

具体来说,我创建了一个干净的 Ubuntu VM,然后调用 Heroku CLI 下载数据库备份(这在我的配置脚本中):

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

但是,由于这是一个干净的 VM,因此这是我第一次运行 Heroku CLI 命令,系统会提示我输入登录凭据。因为脚本是由 Vagrant 管理的,所以没有附加交互式 shell,所以脚本就挂在那里。

4

2 回答 2

4

如果您想将临时输入或变量传递给 Vagrant 脚本,您可以让它们输入其凭据作为该命令的临时环境变量,方法是将它们放在同一行的第一个位置:

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 命令。

于 2015-12-09T19:57:14.917 回答
2

我假设您不想用纯文本硬编码您的凭据,从而试图强制使用交互模式。事情就像您一样,我在 vagrant provision doc ( http://docs.vagrantup.com/v1/docs/provisioners/shell.html ) 中没有看到这样的选项,所以您需要以一种或另一种方式将身份验证嵌入到您的脚本。您是否考虑过使用诸如获取令牌之类的东西并使用 heroku REST Api 而不是 CLI? https://devcenter.heroku.com/articles/authentication

于 2013-01-30T05:51:16.537 回答