4

我已经将这个问题——关于 MySQL over SSH 连接只工作一次——缩小到我的主机known_hosts文件中的冲突行。

本质上,我无法进入我选择的数据库 GUI,因为相同 IP 地址的密钥不同(在重新配置、重新加载等之后)。

一旦我删除了任何有问题的行,我就可以正常使用了。

那么,如何通过 Vagrant 的 shell 命令(我正在配置)修改主机的 ~/.ssh/known_hosts文件?

编辑: 我找到了一个涉及添加/创建~/.ssh/config文件的临时修复(这涉及使用私有 IP 地址):

Host 192.168.*.*
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

应该让你进去。不是真正的修复,因为这种修复可能是一个安全问题。在下面寻找更好的答案。

4

3 回答 3

3

很抱歉让你远离你需要的东西!

从 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

希望我通过提供这个答案至少部分纠正了我的错误:)


原始答案

对于任何人(以及我的)未来参考,我将留下部分答案,即更改 GUEST OS 文件或将文件复制到 GUEST OS:

Vagrant 提供了几个provisioners

解决方案 1:对于简单的文件复制,您可以使用 Vagrant file provisioner。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 网站上的记录很差,我们必须感谢 @tmatilai,他在 serverfault 上回答了类似的问题。

请记住,您应该在目标字段中使用绝对路径,并且复制是由 vagrant 用户执行的,因此文件将具有 vagrant 的所有者:组。

解决方案 2:如果您需要使用 root 权限复制文件,或者确实必须在不使用模板的情况下更改文件,请考虑使用文档齐全的shell provisioner。在这种情况下,文件复制只有在您将文件放置在从 VM(guestOS)中可见的文件夹中时才有效,但您拥有 shell 的所有功能。

解决方案 3:虽然在这种情况下会有点矫枉过正,但您可以使用非常强大的ChefPuppet作为配置器,并通过其中一个框架执行操作。我对 Puppet 一无所知,可能只会谈论 Chef。食谱将非常简单。创建具有所需内容的模板文件 (.erb),然后您的配方将仅将文件放置在必要的位置。当然,您需要一个装有厨师包装的盒子。

于 2014-04-23T12:56:55.233 回答
1

我使用普通的 ssh 进入我的机器以进行配置:

$ ssh-add ~/.vagrant.d/insecure_private_key

使用此设置,已知主机必然会出现问题,但我不想关闭主机密钥检查,因为我也将其用于外部主机。鉴于我的主机包含模式 foo,我在 shell 上执行此操作:

$ ssh -i '' '/foo/d' ~/.ssh/known_hosts

如果您有 GNU/linux 主机而不是 BSD/MacOSX,请删除 -i 之后的空 '' 参数。

然后,您可以安装 vagrant trigger 插件:

$ vagrant plugin install vagrant-triggers

并将上面的代码片段添加到 Vagrantfile 中(注意反引号):

config.trigger.after :destroy do
   puts "Removing known host entries"
   `sed -i '' '/foo/d' ~/.ssh/known_hosts`
end
于 2014-05-21T07:43:43.310 回答
0

这就是我所做的:

我在 Vagrantfile 的顶部定义了IP_ADDRESS和变量。DOMAIN_NAME

然后在里面Vagrant.configure我添加:

config.trigger.after :destroy do |trigger|
  trigger.info = "Removing known_hosts entries"
  trigger.run = {inline: "ssh-keygen -R #{IP_ADDRESS}"}
  trigger.run = {inline: "ssh-keygen -R #{DOMAIN_NAME}"}
end 
于 2018-10-21T19:10:56.443 回答