如何将我自己的公钥添加到Vagrant VM?

添加一个ssh密钥给Vagrant虚拟机时遇到问题。 基本上我在这里的设置工作正常。 一旦虚拟机创build,我可以通过vagrant ssh访问它们,用户“vagrant”存在,并且在authorized_keys文件中有一个用户ssh密钥。

我现在想要做的是:能够通过ssh连接到这些虚拟机或使用scp 。 所以我只需要将我的公钥从id_rsa.pub添加到authorized_keys – 就像我使用ssh-copy-id

有没有办法告诉stream浪者在安装过程中我的公钥应该包含在内? 如果没有(这可能是根据我的谷歌结果),是否有一种方法可以很容易地追加我的公钥在stream浪安装?

复制所需的公钥将直接进入configuration阶段。 确切的答案取决于你想用什么configuration(壳,厨师,木偶等)。 最琐碎的将是一个关键的file提供者,这样的事情:

 config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/me.pub" 

那么,实际上你需要附加到authorized_keys,使用真正的configuration,像Puppet 。 例如,请参阅使用Puppetpipe理SSH授权密钥 。

您可以使用Ruby的核心文件模块,如下所示:

  config.vm.provision "shell" do |s| ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip s.inline = <<-SHELL echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys echo #{ssh_pub_key} >> /root/.ssh/authorized_keys SHELL end 

这个工作示例将~/.ssh/id_rsa.pub附加到vagrant和root用户的~/.ssh/authorized_keys中,这将允许您使用现有的SSH密钥。

有一个更“优雅”的方式来完成你想要做的事情。 您可以find现有的私钥并使用它,而不是经历添加公钥的麻烦。

像这样继续查看现有私钥的path(请看下面的IdentityFile ):

 stream浪的ssh-config 

结果:

 $ vagrant ssh-config
主机magento2.vagrant150
   HostName 127.0.0.1
  用户stream浪者
  港口3150
   UserKnownHostsFile / dev / null
   StrictHostKeyChecking no
   PasswordAuthentication no
   IdentityFile“/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key”
  身份只有是的
   LogLevel致命

然后你可以使用这样的私钥,还要注意closures密码validation的开关

 ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key -o PasswordAuthentication = no vagrant@127.0.0.1 -p 3150

我最终使用如下代码:

 config.ssh.forward_agent = true config.ssh.insert_key = false config.ssh.private_key_path = ["~/.vagrant.d/insecure_private_key","~/.ssh/id_rsa"] config.vm.provision :shell, privileged: false do |s| ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip s.inline = <<-SHELL echo #{ssh_pub_key} >> /home/$USER/.ssh/authorized_keys sudo bash -c "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys" SHELL end 

请注意,我们不应该硬编码到/home/vagrant/.ssh/authorized_keyspath,因为一些stream浪的方块不使用vagrant用户名。

一个更短,更正确的代码应该是:

 ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip config.vm.provision 'shell', inline: "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys" config.vm.provision 'shell', inline: "echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys", privileged: false 

否则,用户的.ssh/authorized_keys将属于root用户。

不过每次运行都会增加一条线,但是Vagrant用于testing,虚拟机的寿命通常很短,所以不是一个大问题。

这是一个很好的线索,帮助我解决了原始海报描述的类似情况。

尽pipe我最终使用了smartwjw答案中提供的设置/逻辑,但是由于我使用VAGRANT_HOME环境variables将vagrant.d目录的核心内容保存在我的开发系统的外部硬盘驱动器上,所以遇到了困难。

所以这里是我在Vagrantfile中使用的调整代码,以适应VAGRANT_HOME环境variables的设置; “魔术”发生在这一行vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d"

 config.ssh.insert_key = false config.ssh.forward_agent = true vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d" config.ssh.private_key_path = ["#{vagrant_home_path}/insecure_private_key", "~/.ssh/id_rsa"] config.vm.provision :shell, privileged: false do |shell_action| ssh_public_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip shell_action.inline = <<-SHELL echo #{ssh_public_key} >> /home/$USER/.ssh/authorized_keys SHELL end 
Interesting Posts