我已经缩小范围 this问题 - 关于 MySQL over SSH 连接只能工作一次 - 我的主机 known_hosts
中的一条冲突行文件。
本质上,我无法进入我选择的数据库 GUI,因为相同 IP 地址的 key 不同(在重新配置、重新加载等之后)。
一旦我删除了任何有问题的行,我就可以正常使用了。
因此,通过 Vagrant 的 shell 命令(我正在配置)如何修改 主机的 ~/.ssh/known_hosts
文件?
编辑:
我发现了一个涉及添加/创建 ~/.ssh/config
的临时修复程序。文件(这涉及使用私有(private) IP 地址):
Host 192.168.*.*
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
应该让你进去。不是真正的修复,因为这种修复可能是一个安全问题。在下面寻找更好的答案。
最佳答案
很抱歉让你远离你需要的东西!
从 Vagrantfile 更改 HOST 文件:
你真正想要的很简单。每次运行 vagrant 命令时,Vagrantfile 都会由 Vagrant 解释。它是常规的 ruby 代码,所以如果你想更改 HOST 文件,你需要做的就是放入执行此更改的 Vagrantfile Ruby 代码。这是我放在 Vagrantfile 末尾的示例代码:
require 'tempfile'
require 'fileutils'
path = '~/.ssh/known_hosts'
temp_file = Tempfile.new('foo')
begin
File.open(path, 'r') do |file|
file.each_line do |line|
if line !~ /REGEX_OF_LINE_YOU_WANT_TO_EXCLUDE/ then
temp_file.puts line
end
end
end
temp_file.rewind
FileUtils.mv(temp_file.path, path)
ensure
temp_file.close
temp_file.unlink
end
请注意通过将您自己的值设置为
REGEX_OF_LINE_YOU_WANT_TO_EXCLUDE
来编辑上面的代码.希望我通过提供这个答案至少部分纠正了我的错误:)
原始答案
对于任何人(以及我的) future 引用,我将留下部分答案,即更改 GUEST OS 文件或将文件复制到 GUEST OS:
Vagrant 提供了几个 provisioners .
解决方案一:对于简单的文件复制,您可以使用 Vagrant 文件供应器 . Vagrantfile 中的以下代码将复制文件
~/known_hosts.template
从您的主机系统到 VM 的文件 /home/vagrant/.ssh/known_hosts
# Context ------------------------------------------------------- Vagrant.configure('2') do |config| # ... # This is the section to add ---------------------------------- config.vm.provision :file do |file| file.source = '~/known_hosts.template' file.destination = '/home/vagrant/.ssh/known_hosts' end #-------------------------------------------------------------- end
Vagrant 网站上的文件配置器文档记录很差,我们必须感谢回答 similar question 的@tmatilai关于服务器故障。
请记住,您应该使用 绝对 中的路径目的地字段,并且该复制正在由 vagrant 用户执行,因此文件将具有 vagrant 的所有者:组。
解决方案 2:如果您需要以 root 权限复制文件,或者确实必须在不使用模板的情况下更改文件,请考虑使用有据可查的 shell provisioner .在这种情况下,文件复制只有在您将文件放置在从 VM(guestOS)中可见的文件夹中时才有效,但您拥有 shell 的所有功能。
解决方案 3:虽然在这种情况下会有点过分,但您可以使用非常强大的 厨师 或 木偶 作为供应商,并通过其中一个框架执行操作。我对 Puppet 一无所知,可能只会谈论 Chef。食谱将非常简单。创建具有所需内容的模板文件 (.erb),然后您的配方将仅将文件放置在必要的位置。当然,您需要一个装有厨师包装的盒子。
关于ssh - 通过 Vagrant 删除主机的 known_host 文件中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23200640/