Vagrant Inline 运行 触发器无法识别 IO 重定向

Vagrant Inline run triggers don't recognize IO redirection

我不知道为什么,但 Vagrant 似乎没有从其自动生成的私钥创建 public 密钥。所以我尝试在 up 命令之后创建它:

Vagrant.configure(2) do |config|

  config.vm.box = "ubuntu/bionic64"

  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--cpus", 1]
    vb.customize ["modifyvm", :id, "--memory", 512]
  end

  config.trigger.after :up do |trigger|
    vagrant_priv_key = ".vagrant/machines/default/virtualbox/private_key"
    trigger.run = {
      inline: "ssh-keygen -y -f #{vagrant_priv_key} > #{vagrant_priv_key}.pub"
    }
  end
end

运行 上面的 Vagrantfile 失败了:

  ...
  default: Too many arguments.
==> default: Trigger run failed
==> default: A script exited with an unacceptable exit code 1.

经过一些调查,我发现 I/O 重定向不适用于 inline shell 设置,使用 path shell 设置有效,但我不想为这个简单的命令创建文件。

Turns out run 选项执行 shell 子进程,我应该 运行 bash 会话中的脚本:

config.trigger.after :up do |trigger|
    vagrant_priv_key = ".vagrant/machines/default/virtualbox/private_key"
    trigger.run = {
      inline: "/bin/bash -c 'ssh-keygen -y -f #{vagrant_priv_key} > #{vagrant_priv_key}.pub'"
    }
end