我怎么能写一个程序(脚本)从的〜/ .ssh / known_hosts中删除过时主机密钥?(How

2019-11-02 13:40发布

我使用都最近被重新配置新的OpenSSH主机密钥约30计算机集群。 当我尝试登录到一个,我得到这个错误消息(为了简洁,删除多条线路):

@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
The fingerprint for the RSA key sent by the remote host is
52:bb:71:83:7e:d0:e2:66:92:0e:10:78:cf:a6:41:49.
Add correct host key in /home/nr/.ssh/known_hosts to get rid of this message.
Offending key in /home/nr/.ssh/known_hosts:50

我可以手动删除有问题的行,在这种情况下,我得到关于IP编辑部地址,这就需要手动删除其他线路不同的投诉,而我却无心重复这个练习29次。 我想编写一个程序来做到这一点。 不幸的是,在你的.ssh文件中的行不再包含明文的主机名和IP地址,因为它在早期版本中。

因此,这里是我的问题:

  • 给定主机名和IP地址,我怎么能写一个程序,找出我的这行~/.ssh/known_hosts存储该主机或IP地址的SSH主机密钥?

如果我能恢复这个信息,我想我可以做其他自己。


脚注:我宁愿在bash / KSH / sh或C或Lua代码; 我Perl和Python是很生疏。


澄清:

  • 我不想删除整个文件,并重新填充; 它包含百余确认键,我不想再验证。

  • 无论我保持单主副本或多个副本,擦洗掉一大群过时的主机密钥遗体的问题。

回答

下面是Lua中使用我写ssh-keygen -F

#!/usr/bin/env lua

require 'osutil'
require 'ioutil'

local known = os.getenv 'HOME' .. '/.ssh/known_hosts'

local function lines(name)
  local lines = { }
  for l in io.lines(name) do
    table.insert(lines, l)
  end
  return lines
end

local function remove_line(host)
  local f = io.popen('ssh-keygen -F ' .. os.quote(host))
  for l in f:lines() do
    local line = l:match '^# Host %S+ found: line (%d+) type %u+$'
    if line then
      local thelines = lines(known)
      table.remove(thelines, assert(tonumber(line)))
      table.insert(thelines, '')
      io.set_contents(known, table.concat(thelines, '\n'))
      return
    end
  end
  io.stderr:write('Host ', host, ' not found in ', known, '\n')
end

for _, host in ipairs(arg) do
  local ip = os.capture('ipaddress ' .. host)
  remove_line(host)
  remove_line(ip)
end

Answer 1:

ssh-keygen -R hostname
ssh-keygen -R ipaddress

我个人擦洗循环和perl的IP地址,并手动删除冲突。

$!/usr/bin/perl
for (1..30){
     `ssh keygen -R 192.168.0.$_`; #note: backticks arent apostrophies
}


Answer 2:

如果我想找出什么线主机生活的条目,

ssh-keygen -F hostname

同样的伎俩可与IP地址。



Answer 3:

触摸和编辑“clearkey.sh”或什么都的名字让你快乐。

#! /bin/bash
# $1 is the first argument supplied after calling the script

sed -i "$1d" ~/.ssh/known_hosts
echo "Deleted line $1 from known_hosts file"

如果能够做到“clearkey.sh 3”,它会删除违规线!



Answer 4:

我通常在bash脚本以下checkssh自动删除行:

#!/bin/bash

# Path to "known_hosts" file
KH=~/.ssh/known_hosts
# Find the host in the file, showing line number
L=`grep -i -n $1 $KH`
# If line is not found, exit
[[ $? -ne 0 ]] && exit
# Isolate line number
L=`echo $L | cut -f 1 -d :`
sed -i "${L}d" $KH

您可以添加ssh $1 exit在结束时自动重新创建文件项时,如果你的ssh配置这样做。

这样称呼它checkssh <hostname>



文章来源: How can I write a program (script) to remove obsolete host keys from ~/.ssh/known_hosts?
标签: ssh openssh