通过Vagrant删除主机的known_host文件中的行

时间:2014-04-21 15:42:22

标签: ssh vagrant vagrantfile

我已经将this问题 - 关于MySQL通过SSH连接仅工作一次 - 缩小到我的主机known_hosts文件中的冲突行。

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

一旦我删除了任何有问题的行,我就可以进入。

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

修改 我找到了一个临时解决方案,涉及添加/创建~/.ssh/config文件(这涉及使用私有IP地址):

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

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

3 个答案:

答案 0 :(得分:3)

很抱歉让您远离您的需求!

从Vagrantfile更改HOST文件:

你真正想要的是非常简单。每次运行vagrant命令时,Vagrant都会解释Vagrantfile。它是常规的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 文件配置程序。 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在服务器故障上回复了similar question

请注意,您应该在目标字段中使用绝对路径,并且该流行用户正在执行复制,因此该文件将拥有流浪汉的所有者:组。

解决方案编号2:如果您需要复制具有root权限的文件,或者确实需要在不使用模板的情况下更改文件,请考虑使用记录良好的shell provisioner。在这种情况下,只有当文件放在VM(guestOS)中可见的文件夹中时,文件复制才有效,但是你拥有shell的所有功能。

解决方案编号3:虽然在这种情况下可能会出现问题,但您可以使用非常强大的 Chef Puppet 作为配置程序,并执行通过其中一个框架采取行动。我对Puppet一无所知,可能只会谈论厨师。 Cookbook非常简单。使用所需内容创建模板文件(.erb),然后您的配方将根据需要放置文件。当然,你需要一个装有厨师包装盒的盒子。

答案 1 :(得分:1)

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

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

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

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

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

然后您可以安装vagrant触发器插件:

$ vagrant plugin install vagrant-triggers

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

config.trigger.after :destroy do
   puts "Removing known host entries"
   `sed -i '' '/foo/d' ~/.ssh/known_hosts`
end

答案 2 :(得分:0)

这就是我的工作

我在Vagrantfile的顶部定义IP_ADDRESSDOMAIN_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