Можно ли удалить определенный ключ хоста из файла known_hosts SSH?


310

Можно ли удалить определенный ключ хоста из файла known_hosts SSH?

Я обычно заканчиваю тем, что удаляю весь known_hostsфайл, с которым у меня нет проблем, но просто из любопытства, возможно ли удалить только одну запись?

Я открыл known_hostsфайл, но я изо всех сил пытаюсь понять его содержание.

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

Add correct host key in /home/wissen16/.ssh/known_hosts to get rid of this message.
Offending key in /home/wissen16/.ssh/known_hosts:1
RSA host key for foo.com has changed and you have requested strict checking.
Host key verification failed.

Ответы:


515

Используйте эту команду, чтобы удалить записи из known_hosts:

ssh-keygen -R hostname

21
Он также работает с IP-адресом. Например, у меня есть ярлык DNS-узла для моего веб-сервера. Чтобы устранить конфликт между ключами для пользовательского имени хоста и IP-адресом, мне пришлось удалить записи для обоих. Так что ssh-keygen -R xxx.xxx.xxx.xxx.
StrangeElement

Как говорит @StrangeElement, иногда возможно, что вы должны удалить IP-хост, кроме имени хоста.
Гонсало Цао

4
Кроме того, он автоматически сохраняет резервную копию (на моей машине osx: Original contents retained as /Users/nha/.ssh/known_hosts.oldпри условии, что она одинакова для Ubuntu).
Ня

17
Плюс, если вы используете нестандартный порт ssh, используйте этот форматssh-keygen -R [ssh.sssshh.com]:1234
Shiji.J

Лучший ответ на этот вопрос. Работает как шарм
бадемба

32

Да, вы можете удалить только один ключ. Просто откройте его в редакторе и удалите оскорбительную строку. Число после двоеточия в сообщении об ошибке является номером строки, так что это строка для удаления - строка 1 в вашем примере ..


1
Я понятия не имел, что он определил номер строки, что невероятно полезно.
Deltree

19

Я только недавно начал использовать ключи хоста, но когда я их перепутал, это, как правило, по одному ключу на строку, поэтому делайте резервную копию файла и удаляйте их по одному, пока не найдете нужный. Затем добавьте остальные обратно. Это долгий путь, но он должен работать.

Также основанный на этой ошибке, и не зная, что вообще, это может быть первый ключ хоста в файле, который является проблемой, поэтому откройте файл с помощью vim

vim ~/.ssh/known_hosts

и ударил

dd

затем сохраните его.


Вы можете использовать: установить nu в vim, чтобы показать номера строк. Таккат ответ является лучшим в любом случае.
Хавьер Ривера

Я согласен, не знал, что ты мог сделать это. Я собираюсь использовать его в будущем. Я продолжал искать настройки номеров строк для vim. Благодарю.
Бадди Линдси

3

Использование ssh-keygen -R hostname не всегда будет работать. Если у вас есть более новая версия SSH, которая «скрывает» имена хостов для предотвращения перехвата ssh-agent, очевидно, ssh-keygen не сможет отменить хэширование имени хоста.

Например, у меня есть хост с именем build-node-01, и я подключился к нему и принял ключ. Затем я воссоздаю его с нуля, получаю новый отпечаток хоста и пытаюсь восстановить соединение, я получу предупреждение о конфликте в строке X (скажем, 3). Я бегу ssh-keygen -R hostname, но при следующей попытке подключения я получаю предупреждение о конфликте. Я проверил файл только для того, чтобы обнаружить, что имя хоста было хешировано и отображалось как [1] Bu4Ch@R@4D0M57uFFвместо читаемого имени хоста.

В этом случае единственный способ успешно удалить нарушающий хост - использовать

sed -i 'xd' ~/.ssh/known_hosts

Чтобы сделать это на шаг дальше, вы можете сделать резервную копию known_hosts на случай, если удалите неправильную строку, в этом случае просто добавьте .bak (или любое расширение) к опции -i, чтобы создать резервную копию с этим расширение. Использование ssh-keygen делает это автоматически.

sed -i.bak 'xd' ~/.ssh/known_hosts

5
Это не правильно. ssh-keygen -R {hostname}будет работать, даже если имена хостов скрыты (хешированы). Тем не менее, да, можно удалить запись по номеру (например, 10-я запись через sed -i.bak 10d ~/.ssh/known_hosts), но это обычно не требуется. Возможно, использовался нестандартный порт, и в этом случае вам может потребоваться отформатировать команду как (обратите внимание на кавычки):ssh-keygen -R '[hostname]:2222'
Майкл

Полезно знать @michael_n, очень вероятно, что это был нестандартный порт, который влиял на мою способность удалить запись. Я также должен отметить, что если вы приняли несколько отпечатков пальцев для хоста, я не уверен, удаляет ли он ВСЕ записи сразу или только по одной за раз.
dragon788 20.09.16

1

Просто чтобы поделиться еще одним простым и понятным ответом, который я только что нашел. Удаление имени хоста мне не подходит, так как файл known_hosts хэшируется. Тем не менее, я мог бы вручную отредактировать запись хоста на основе номера строки в сообщении об ошибке. Как уже отмечал Майк Скотт, номер строки имени хоста, который нарушил работу, указан в сообщении об ошибке.

Или я могу сделать это. Отсюда: как исправить неправильный ключ в файле ssh known_hosts

Я получил немного магии кли

sed -i 'xd' ~/.ssh/known_hosts

Замените х на номер строки и вуаля. Он также предлагает perl-ответ, если sed не будет работать.


0
sed '/10\.20\.120\.211/d' ~/.ssh/known_hosts > temp && mv temp ~/.ssh/known_hosts

В этом случае 10.20.120.211 - это хост, который я хочу удалить из моего файла known_hosts, убедитесь, что вы экранировали специальные символы, такие как (.)


IP-адреса и имена хостов больше не хранятся дословно (открытый текст) в файле известных хостов, поэтому это не сработает. Нужно либо использовать ssh-keygen -R ...(желательно); или sedс конкретным номером строки для удаления. Кроме того, на sedместе используйте -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` для удаления 10-й строки и (необязательно) сохраните оригинал в файле резервной копии с суффиксом .bak.
Майкл

0

Вы можете избежать удаления конкретного хоста, обновив его:

ssh-keyscan -t ecdsa hostname >> ~/.ssh/known_hosts

Таким образом, вам не нужно снова подключаться к хосту.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.