Удалить ключ из известных_хостов

325430
Adam Matan

Я построил несколько виртуальных машин за последние несколько недель. Проблема в том, что предупреждает .ssh/known_hostsменя Человек в среднем . Это происходит потому, что с IP-адресом виртуальной машины связан другой отпечаток.

В этом .ssh/known_hostsфайле, однако, я не нахожу записи, относящиеся к IP, только две странные, подобные ключу строки и "ssh-rsa".

У кого-нибудь есть идеи о том, как удалить старый ключ known_hosts?

111
«Странные, похожие на ключи строки», на которые вы ссылаетесь, являются хешированными адресами хостов / ip. Эта функция безопасности помогает злоумышленнику узнать, к каким системам у вас есть доступ. Если вы видите это, тогда ваш ssh_config имеет значение `` `HashKnownHosts yes````. Deebster 9 лет назад 5
Если вы считаете, что содержимое файла слишком запутанное, возможно, активирована перенос строки. Деактивировать это. Все строки начинаются с имени хоста или IP-адреса. Daniel B 5 лет назад 0

10 ответов на вопрос

94
Sean Staats

Самое простое решение:

rm -f .ssh/known_hosts 

ssh заново создаст файл, но вы потеряете проверку ключей для других хостов!

Или вы можете использовать:

ssh-keygen -R "hostname" 

Или в сообщении ssh "man-in-the-middle" должно быть указано, какая строка файла known_hosts имеет неправильный отпечаток. Отредактируйте файл, перейдите к этой строке и удалите его.

Правильно - номер строки несколько застенчив: «Добавьте правильный ключ хоста в /home/adam/.ssh/known_hosts, чтобы избавиться от этого сообщения. Ключ-нарушитель в /home/udi/.ssh/known_hosts:48». Убрал строку 48 и все заработало! Adam Matan 14 лет назад 0
`ssh-keygen -R hostname` тоже будет работать. grawity 14 лет назад 47
Спасибо за упоминание `ssh-keygen -R`. Я просто хотел удалить хост из `known_hosts` для целей тестирования (т.е. без изменения ключа хоста), и эта запись хостов была хэширована ... Andre Holzner 12 лет назад 0
Если мы удалим этот файл, другие ключи тоже будут удалены. shgnInc 9 лет назад 4
Удаление файла - плохой совет, это все равно, что сказать кому-то купить новый компьютер, потому что у старого сломана мышь. Ручное редактирование файла, который может быть отредактирован официальным приложением, также является плохой идеей. Опция `ssh-keygen` была добавлена ​​из-за комментария, но без объяснения. Я не думаю, что этот ответ заслуживает так много голосов. kraxor 9 лет назад 11
-1 из-за всей первой строки «удалить весь файл known_hosts». Это ужасная, ужасная, ужасная вещь, которую нужно предложить, и она должна быть отредактирована. Olivier Dulac 9 лет назад 9
Это решение является излишним. Просто удалите оскорбительную строку. Вот и все. Blake Frederick 7 лет назад 2
Добавлены ли самые новые известные_хосты в верхней или нижней строке? hello_there_andy 7 лет назад 0
79
mikewaters
sed -i '6d' ~/.ssh/known_hosts 

Изменит файл ~ / .ssh / known_hosts: 6, удалив 6-ю строку.

На мой взгляд, использование ssh-keygen -R- лучшее решение для опытных пользователей openssh, в то время как ваш обычный администратор Linux будет лучше поддерживать свои навыки sed, используя вышеописанный метод.

Я не думаю, что это хороший совет, чтобы редактировать файл конфигурации вручную, если у вас есть официальное приложение для этого. Риски не делают вас профессионалом, а находят самый быстрый и безопасный вариант. Это все равно, что сказать людям идти вперед и редактировать `/ etc / sudoers` без` visudo`. Если вы хотите оттачивать свои навыки `sed ', продолжайте и делайте это, не портя свою систему. kraxor 9 лет назад 12
"if you have an official application for that" => both `ssh-keygen -R` and `sed -i d` are pretty "official", and both will work for the foreseeable future. Util ssh-keygen allows removal by line number, both are perfectly acceptable (because, line numbers are often easier to deal with, and less error prone, than dealing with modern data center host-names). michael 7 лет назад 0
А) Исключение конкретно 6-й строки, все очень "смотри без рук". Нет никакого объяснения относительно того, что важно в 6-ой строке файла ?! B) Также `man ssh-keygen` упоминает` ssh-keygen -R hostname`, вы только что сказали `ssh-keygen -R` без указания имени хоста, и вы не объяснили, что вы подразумеваете под этим. barlop 6 лет назад 2
58
user201564

Для этого есть переключатель ssh-keygen (-R).

man ssh-keygen читает:

-R hostname Удаляет все ключи, принадлежащие имени хоста, из файла known_hosts. Эта опция полезна для удаления хешированных хостов (см. Опцию -H выше).

Это самый простой и безопасный метод. Leo 10 лет назад 7
Примечание. Это изменит разрешения для файла known_hosts на 0600. Если по какой-либо причине у вас есть общий файл known_hosts, это может привести к отключению общего доступа к нему. Jiri Klouda 6 лет назад 0
и правильный. Кроме того, мне пришлось сделать `[localhost]: port`, используя скобки, потому что я использовал собственный порт, я думаю = /. Как уже говорили другие, я бы также использовал подход без проверки ключей SSH для разработки моей переходной / тестовой системы. Pysis 5 лет назад 0
16
innaM

В предупреждении будет указана точная строка в известном файле hosts.

Вот пример:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: POSSIBLE DNS SPOOFING DETECTED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ The RSA host key for foo-bar.net has changed, and the key for the corresponding IP address 127.0.0.1 is unchanged. This could either mean that DNS SPOOFING is happening or the IP address for the host and its host key have changed at the same time. Offending key for IP in /home/user/.ssh/known_hosts:6 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! 

Видишь /home/user/.ssh/known_hosts:6часть? Он определяет файл и номер строки.

9
rouble

Вы также можете указать ssh не проверять файл known_hosts, используя флаги UserKnownHostsFile и StrictHostKeyChecking.

Например:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com 

Для простоты использования вы можете использовать псевдоним:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' 

Теперь вы можете просто boldssh, когда вы уверены, что доверяете сертификату сервера.

Какая ужасная идея. Навсегда отключите слой безопасности только потому, что вам лень обновлять ваш файл ~ ~ / .ssh / known_hosts? Почему бы просто не пойти дальше и использовать `telnet`? «всякий раз, когда вы уверены» - если вы когда-либо уверены, тогда вы не представляете, что такое атака MITM, и вам, вероятно, следует потратить некоторое время на чтение хорошей литературы. kraxor 9 лет назад 7
Исходя из вопроса ОП, я думаю, что это правильный ответ. Иногда у вас есть тестовая система, на которой вы создаете / уничтожаете множество виртуальных машин. (Я делаю это прямо сейчас, когда я готовлюсь к экзамену RHCE.) Может не быть никаких последствий для безопасности. Отмечая, что последствия для безопасности велики, я не думаю, что это должно быть названо «ужасной идеей». Rick Chatham 8 лет назад 2
связанные: http://superuser.com/a/1126243/73961 michael 7 лет назад 0
4
Tarun Gupta

Вам нужно выполнить следующую команду, чтобы избавиться от этой проблемы. Откройте терминал и введите следующую команду:

Для всех приведенных ниже примеров просто замените значение после -R

ssh-keygen -R server-name ssh-keygen -R server.ip.addre.ss ssh-keygen -R 202.54.1.5 ssh-keygen -R server1.example.com 
Этот метод уже был предложен в предыдущих ответах. Не могли бы вы рассказать о том, что отличается в вашем ответе? Burgi 7 лет назад 0
@Burgi - этот ответ дает более подробную информацию о синтаксисе `ssh-keygen -R`, чем любой другой ответ на данный момент. Это показывает на примере, что именно вы можете написать после `-R`. Так что этот ответ стоит того, хотя и не совсем новый. Yitz 6 лет назад 0
@Yitz Мой комментарий был сделан как часть обзора. В то время (18 месяцев назад) я думал, что вопрос нуждается в небольшой помощи, чтобы сделать его еще лучше. Burgi 6 лет назад 0
2
grosser

Вы также можете удалить одну строку из известных хостов с помощью, например, rmknownhost 111 (111 - строка для удаления):

#! /usr/bin/env ruby line = ARGV[0] || raise("gimme line to remove") hosts = File.expand_path("~/.ssh/known_hosts") content = File.readlines(hosts) removed = content.delete_at line.to_i - 1 puts "Removed:\n#" File.open(hosts, 'w'){|f| f.write content * ""} 

Сохраните это как rmknownhostв папке из вашего PATH.

Какая польза от этого в любом текстовом редакторе? Есть ли какая-то причина не делать это таким образом, например, как редактировать sudoers с помощью visudo? Andy Lester 13 лет назад 0
Какие дистрибутивы идут с этим? У Ubuntu, похоже, нет этого. flickerfly 10 лет назад 0
Преимущество в том, что это автоматизировано и быстро / это отдельный двоичный файл, который вы добавляете сами grosser 10 лет назад 0
Вы могли бы просто опубликовать свой сценарий здесь вместо того, чтобы связывать свою собственную запись в блоге, которую вы создали в день публикации этого ответа. Это квалифицируется как спам ИМХО. Не говоря уже о том, что вы можете создать простой псевдоним для достижения того же результата, нет необходимости в сценарии ruby ​​длиной 7 строк. kraxor 9 лет назад 0
0
stimms

Запись для имени хоста или ip должна быть в первом столбце. В предупреждении также должен быть указан номер строки, в которой находится нарушающий ключ.

0
Ryan Griggs

Это текстовый файл. Вы можете легко редактировать с помощью vi (m) и просто удалить соответствующую строку (dd) и сохранить файл (wq). Но если есть специальная команда для удаления хоста, это, вероятно, самый безопасный метод.

Я не вижу, как редактировать файл непосредственно в VIM "небезопасно". Он основан на вашем уровне комфорта с VIM. Особенно с этим файлом вы рискуете удалить слишком много ключей, и в этом случае вы просто получите запрос снова. Rick Chatham 8 лет назад 0
«Безопасность», о которой я говорил, включает в себя: 1) забыть / не знать, чтобы удалить зависимую информацию в других файлах (если таковые имеются) и 2) случайно удалить больше или меньше, чем необходимо, тем самым сломав файл. Ryan Griggs 8 лет назад 0
0
Arunas Bartisius

Все ответы хороши, но для реального SSH pro у нас отсутствует информация о том, как удалить ssh-подпись с номером порта.

Например, вы подключаетесь к

ssh some.host.name -p 222 

и вы получите предупреждение, и чтобы удалить это, вам нужно использовать квадратные скобки номер порта двоеточия:

ssh-keygen -R [some.host.name]:222 

Надеюсь, это поможет пользователям нестандартной конфигурации.

Похожие вопросы