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

标签 ssh vagrant vagrantfile

我已经缩小范围 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/

相关文章:

ssh - vagrant ssh 没有按预期工作,它不符合我的自定义设置

linux - Centos 6.4 Nodejs 外部没有响应

未设置 PHP cURL 选项

bash - Vagrant 报告一个没有任何运行的端口冲突

ruby - 错误 : Cookbook loaded at path(s) has invalid metadata

asp.net - .NET 开发人员的 Vagrant 文件(使用 Windows、IIS、MS SQL)

docker - vagrant:Docker 实例启动后在 Virtualbox 中运行 shell 脚本(顺序错误)

git - 将 ssh 代理套接字转发到 docker build

mercurial - 通过 SSH 克隆 Mercurial 存储库

ssh - 通过SSH进行Rsync-ssh或rsync超时?