Ssh 删除主机中的行';通过Vagrant创建已知的\u主机文件
我已经把关于MySQL over SSH连接只工作一次的问题缩小到主机的Ssh 删除主机中的行';通过Vagrant创建已知的\u主机文件,ssh,vagrant,vagrantfile,Ssh,Vagrant,Vagrantfile,我已经把关于MySQL over SSH连接只工作一次的问题缩小到主机的已知\u hosts文件中的冲突行 本质上,我无法进入我选择的数据库GUI,因为同一IP地址的密钥不同(在重新设置、重新加载等之后) 一旦我删除了任何有问题的行,我就可以很好地进入了 那么,通过Vagrant的shell命令(我正在使用该命令进行设置),如何修改主机的~/.ssh/known_hosts文件 编辑: 我发现了一个临时修复程序,它涉及添加/创建~/.ssh/config文件(这涉及使用私有IP地址): 应该让你
已知\u hosts
文件中的冲突行
本质上,我无法进入我选择的数据库GUI,因为同一IP地址的密钥不同(在重新设置、重新加载等之后)
一旦我删除了任何有问题的行,我就可以很好地进入了
那么,通过Vagrant的shell命令(我正在使用该命令进行设置),如何修改主机的~/.ssh/known_hosts
文件
编辑:
我发现了一个临时修复程序,它涉及添加/创建~/.ssh/config
文件(这涉及使用私有IP地址):
应该让你进去。不是真正的修复,因为这种修复可能会带来安全问题。请看下面更好的答案。很抱歉让您失去了您所需要的 将主机文件从文件更改为文件: 你真正想要的是非常简单的。每次运行Vagrant命令时,Vagrant都会解释Vagrant文件。这是常规的ruby代码,所以如果您想更改主机文件,您所需要做的就是将执行此更改的Vagrantfile ruby代码放入其中。下面是我在Vagrant文件末尾的示例代码:
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\u添加自己的值
希望我至少通过提供以下答案部分纠正了我的错误:)
原始答案
对于任何人(我也是)将来的参考,我留下了部分答案,涉及到更改来宾操作系统文件或将文件复制到来宾操作系统:
流浪汉提供了两份工作
解决方案编号1:对于简单文件复制,您可以使用Vagrant文件供应器。vagrant文件中的以下代码将文件~/known_hosts.template
从主机系统复制到VM的文件/home/vagrant/.ssh/known_hosts
在Vagrant站点上,文件供应器的文档记录很差,我们必须感谢@tmatilai,他回答了serverfault
请记住,您应该在目的地字段中使用绝对路径,并且复制是由流浪用户执行的,因此文件将具有流浪者的所有者:组
<强>解决方案号2:如果需要复制具有root权限的文件,或者确实需要在不使用模板的情况下更改文件,请考虑使用已记录的文件。在这种情况下,只有当您将文件放在VM(guestOS)中可见的文件夹中时,文件复制才会起作用,但您拥有shell的所有功能
解决方案编号3:虽然在这种情况下会有点过火,但您可以使用非常强大的厨师或木偶作为供应器,并通过这些框架之一执行操作。我对木偶一无所知,可能只会谈论厨师。食谱会很简单。创建包含所需内容的模板文件(.erb),然后您的配方将只在必要时放置该文件。当然,您需要一个包含Chef packeges的盒子。我使用纯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
并将上述代码段添加到Vagrant文件中(注意背景标记):
我就是这么做的:
我在文件顶部定义了IP\u地址
和域名
变量
然后在Vagrant.configure
I中添加:
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
谢谢你的信息!我一定会调查的。Mitchell已经在Github上回复了,因为我也为此提交了一个bug,并提供了一些很好的信息,基本上解释了这是一个bug,已经在git版本的Vagrant中修复了,但在安装程序中还没有。还有人建议将~/.ssh/config文件与所选IP一起使用(我使用的是私有IP,因此它似乎也可以正常工作),以禁用对给定请求的已知_hosts文件的检查和存储。我很欣赏Hammer的解决方案,我现在正在加强我与Puppet和Chef的技能,因为我也在了解你的解决方案。然而,我现在在Puppet上遇到了很多问题,甚至配置了一个基本的Web服务器,所以我可能需要一段时间才能实现任何东西。哦,我该死的上帝!我完全没有听到“主持人”这个词!D:我的答案都是关于来宾操作系统的!(facepalm)我把你引向了完全错误的方向。抱歉编辑了我的答案。这实际上是对你问题的回答。很抱歉给您带来不便!但是,如果我只对本地IP(或我对所有流浪者反复使用的私有IP)禁用主机密钥检查,我是否仍然会在设置不限于的每个其他出站请求上检查它?你是说$sed-I''/foo/d'~/.ssh/known_hosts
而不是$ssh-I'/foo/d'~/.ssh/known_hosts
?
$ vagrant plugin install vagrant-triggers
config.trigger.after :destroy do
puts "Removing known host entries"
`sed -i '' '/foo/d' ~/.ssh/known_hosts`
end
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