Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssh 删除主机中的行';通过Vagrant创建已知的\u主机文件_Ssh_Vagrant_Vagrantfile - Fatal编程技术网

Ssh 删除主机中的行';通过Vagrant创建已知的\u主机文件

Ssh 删除主机中的行';通过Vagrant创建已知的\u主机文件,ssh,vagrant,vagrantfile,Ssh,Vagrant,Vagrantfile,我已经把关于MySQL over SSH连接只工作一次的问题缩小到主机的已知\u hosts文件中的冲突行 本质上,我无法进入我选择的数据库GUI,因为同一IP地址的密钥不同(在重新设置、重新加载等之后) 一旦我删除了任何有问题的行,我就可以很好地进入了 那么,通过Vagrant的shell命令(我正在使用该命令进行设置),如何修改主机的~/.ssh/known_hosts文件 编辑: 我发现了一个临时修复程序,它涉及添加/创建~/.ssh/config文件(这涉及使用私有IP地址): 应该让你

我已经把关于MySQL over SSH连接只工作一次的问题缩小到主机的
已知\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