我已经将this问题 - 关于MySQL通过SSH连接仅工作一次 - 缩小到我的主机known_hosts
文件中的冲突行。
基本上,我无法进入我选择的数据库GUI,因为相同IP地址的密钥不同(在重新配置,重新加载等之后)。
一旦我删除了任何有问题的行,我就可以进入。
那么,通过Vagrant的shell命令(我正在配置)如何修改主机 ~/.ssh/known_hosts
文件?
修改
我找到了一个临时解决方案,涉及添加/创建~/.ssh/config
文件(这涉及使用私有IP地址):
Host 192.168.*.*
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
应该让你进来。不是真正的修复,因为这种修复可能是一个安全问题。请看下面更好的答案。
答案 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_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