无法使用不安全的私钥通过 ssh 连接到 vagrant 虚拟机 (vagrant 1.7.2)
Can't ssh to vagrant VMs using the insecure private key (vagrant 1.7.2)
我有一个包含 3 个虚拟机的集群。这是流浪文件:
# -*- mode: ruby -*-
# vi: set ft=ruby :
hosts = {
"host0" => "192.168.33.10",
"host1" => "192.168.33.11",
"host2" => "192.168.33.12"
}
Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.ssh.private_key_path = File.expand_path('~/.vagrant.d/insecure_private_key')
hosts.each do |name, ip|
config.vm.define name do |machine|
machine.vm.hostname = "%s.example.org" % name
machine.vm.network :private_network, ip: ip
machine.vm.provider "virtualbox" do |v|
v.name = name
# #v.customize ["modifyvm", :id, "--memory", 200]
end
end
end
end
这在我最近升级之前一直有效:
ssh -i ~/.vagrant.d/insecure_private_key vagrant@192.168.33.10
相反,vagrant 要求输入密码。
最近版本的 vagrant(我使用的是 1.7.2)似乎为每台机器创建了一个安全的私钥。我通过 运行
发现了它
vagrant ssh-config
输出显示每个主机的不同密钥。我通过比较它们验证了密钥是不同的。
我试图通过在 Vagrantfile 中设置 config.ssh.private_key_path 来强制使用不安全的密钥,但它不起作用。
我想对所有机器使用不安全密钥的原因是我想使用 ansible 从外部配置它们。我不想使用 Ansible provisioner,而是将 VM 视为远程服务器。因此,Vagrantfile 只是用来指定集群中的机器,然后在外部进行配置。
文档仍然说默认情况下机器将使用不安全的私钥。
如何让我的虚拟机使用不安全的私钥?
Vagrant 更改了 1.6 和 1.7 版本之间的行为,现在将插入自动生成的不安全密钥而不是默认密钥。
您可以通过在 Vagrantfile 中设置 config.ssh.insert_key = false
来取消此行为。
如果你像你一样指定 private_key_path
,Vagrant 不应该替换不安全的密钥,但是内部逻辑会检查 private_key_path
是否指向默认的 insecure_private_key
,如果它指向, Vagrant 将取代它。
可以找到更多信息 here。
tldr;
ssh vagrant@127.0.0.1 -p2222 -i/~/www/vw/vw-environment/.vagrant/machines/default/virtualbox/private_key
我无法让它工作,所以最后我将以下内容添加到 ssh.rb ruby 脚本 (/opt/vagrant/embedded/gems/gems/vagrant-1.7.1//lib/vagrant/util/ssh.rb
)
print(*command_options)
就在执行 ssh 调用的这一行之前
SafeExec.exec("ssh", *command_options)
因此打印出传递给 ssh 调用的所有命令选项,从那里您可以根据 vagrant 计算出的正确 ssh 参数计算出适合您的东西。
当 Vagrant 创建一个新的 ssh 密钥时,它使用默认配置保存在 .vagrant/machines/default/virtualbox/private_key.
的 Vagrantfile 目录下
使用自动生成的密钥,您可以从与 Vagrantfile 相同的目录登录,如下所示:
ssh -i .vagrant/machines/default/virtualbox/private_key -p 2222 vagrant@localhost
要了解有关 vagrant box 实际 ssh 配置的所有详细信息,请使用 vagrant ssh-config 命令。
# vagrant ssh-config
Host default
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/babo/src/centos/.vagrant/machines/default/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
将 config.ssh.insert_key = false
添加到 Vagrantfile 并删除新的 vm 私钥 .vagrant/machines/default/virtualbox/private_key
vagrant 会使用正确的私钥 ~/.vagrant.d/insecure_private_key
自动更新 vagrant ssh-config
。我必须做的最后一件事是通过 ssh 进入虚拟机并更新虚拟机上的授权密钥文件。 curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub > ~/.ssh/authorized_keys
如果您专门使用 Ansible(不是 Vagrant Ansible provisioner),您可能需要考虑使用 Ansible 存储库中的 vagrant 动态清单脚本:
或者,您可以手工编写自己的脚本并动态构建自己的 vagrant 库存文件:
SYSTEMS=$(vagrant status | grep running | cut -d ' ' -f1)
echo '[vagrant_systems]' > vagrant.ini
for SYSTEM in ${SYSTEMS}; do
SSHCONFIG=$(vagrant ssh-config ${SYSTEM})
IDENTITY_FILE=$(echo "${SSHCONFIG}" | grep -o "\/.*${SYSTEM}.*")
PORT=$(echo "${SSHCONFIG}" | grep -oE '[0-9]{4,5}')
echo "${SYSTEM} ansible_ssh_host=127.0.0.1 ansible_ssh_port=${PORT} ansible_ssh_private_key_file=${IDENTITY_FILE}" >> vagrant.ini
done
然后使用ansible-playbook -i=vagrant.ini
如果您尝试使用 ~/.ssh/config
,则必须动态创建或编辑现有条目,因为 ssh 端口可能会更改(由于 Vagrant 中的冲突检测)。
我有一个包含 3 个虚拟机的集群。这是流浪文件:
# -*- mode: ruby -*-
# vi: set ft=ruby :
hosts = {
"host0" => "192.168.33.10",
"host1" => "192.168.33.11",
"host2" => "192.168.33.12"
}
Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.ssh.private_key_path = File.expand_path('~/.vagrant.d/insecure_private_key')
hosts.each do |name, ip|
config.vm.define name do |machine|
machine.vm.hostname = "%s.example.org" % name
machine.vm.network :private_network, ip: ip
machine.vm.provider "virtualbox" do |v|
v.name = name
# #v.customize ["modifyvm", :id, "--memory", 200]
end
end
end
end
这在我最近升级之前一直有效:
ssh -i ~/.vagrant.d/insecure_private_key vagrant@192.168.33.10
相反,vagrant 要求输入密码。
最近版本的 vagrant(我使用的是 1.7.2)似乎为每台机器创建了一个安全的私钥。我通过 运行
发现了它vagrant ssh-config
输出显示每个主机的不同密钥。我通过比较它们验证了密钥是不同的。
我试图通过在 Vagrantfile 中设置 config.ssh.private_key_path 来强制使用不安全的密钥,但它不起作用。
我想对所有机器使用不安全密钥的原因是我想使用 ansible 从外部配置它们。我不想使用 Ansible provisioner,而是将 VM 视为远程服务器。因此,Vagrantfile 只是用来指定集群中的机器,然后在外部进行配置。
文档仍然说默认情况下机器将使用不安全的私钥。
如何让我的虚拟机使用不安全的私钥?
Vagrant 更改了 1.6 和 1.7 版本之间的行为,现在将插入自动生成的不安全密钥而不是默认密钥。
您可以通过在 Vagrantfile 中设置 config.ssh.insert_key = false
来取消此行为。
如果你像你一样指定 private_key_path
,Vagrant 不应该替换不安全的密钥,但是内部逻辑会检查 private_key_path
是否指向默认的 insecure_private_key
,如果它指向, Vagrant 将取代它。
可以找到更多信息 here。
tldr;
ssh vagrant@127.0.0.1 -p2222 -i/~/www/vw/vw-environment/.vagrant/machines/default/virtualbox/private_key
我无法让它工作,所以最后我将以下内容添加到 ssh.rb ruby 脚本 (/opt/vagrant/embedded/gems/gems/vagrant-1.7.1//lib/vagrant/util/ssh.rb
)
print(*command_options)
就在执行 ssh 调用的这一行之前
SafeExec.exec("ssh", *command_options)
因此打印出传递给 ssh 调用的所有命令选项,从那里您可以根据 vagrant 计算出的正确 ssh 参数计算出适合您的东西。
当 Vagrant 创建一个新的 ssh 密钥时,它使用默认配置保存在 .vagrant/machines/default/virtualbox/private_key.
的 Vagrantfile 目录下使用自动生成的密钥,您可以从与 Vagrantfile 相同的目录登录,如下所示:
ssh -i .vagrant/machines/default/virtualbox/private_key -p 2222 vagrant@localhost
要了解有关 vagrant box 实际 ssh 配置的所有详细信息,请使用 vagrant ssh-config 命令。
# vagrant ssh-config
Host default
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/babo/src/centos/.vagrant/machines/default/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
将 config.ssh.insert_key = false
添加到 Vagrantfile 并删除新的 vm 私钥 .vagrant/machines/default/virtualbox/private_key
vagrant 会使用正确的私钥 ~/.vagrant.d/insecure_private_key
自动更新 vagrant ssh-config
。我必须做的最后一件事是通过 ssh 进入虚拟机并更新虚拟机上的授权密钥文件。 curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub > ~/.ssh/authorized_keys
如果您专门使用 Ansible(不是 Vagrant Ansible provisioner),您可能需要考虑使用 Ansible 存储库中的 vagrant 动态清单脚本:
或者,您可以手工编写自己的脚本并动态构建自己的 vagrant 库存文件:
SYSTEMS=$(vagrant status | grep running | cut -d ' ' -f1)
echo '[vagrant_systems]' > vagrant.ini
for SYSTEM in ${SYSTEMS}; do
SSHCONFIG=$(vagrant ssh-config ${SYSTEM})
IDENTITY_FILE=$(echo "${SSHCONFIG}" | grep -o "\/.*${SYSTEM}.*")
PORT=$(echo "${SSHCONFIG}" | grep -oE '[0-9]{4,5}')
echo "${SYSTEM} ansible_ssh_host=127.0.0.1 ansible_ssh_port=${PORT} ansible_ssh_private_key_file=${IDENTITY_FILE}" >> vagrant.ini
done
然后使用ansible-playbook -i=vagrant.ini
如果您尝试使用 ~/.ssh/config
,则必须动态创建或编辑现有条目,因为 ssh 端口可能会更改(由于 Vagrant 中的冲突检测)。