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


Можно ли удалить конкретный ключ хоста из файла 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.

249
2018-01-10 05:56


происхождения




ответы:


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

ssh-keygen -R hostname

427
2018-01-10 07:43



Он также работает с IP-адресом. Например, у меня есть ярлык хоста DNS для моего веб-сервера. Чтобы удалить конфликт между ключами для имени хоста и IP-адресом, мне пришлось удалить записи для обоих. Так ssh-keygen -R xxx.xxx.xxx.xxx. - StrangeElement
Как говорит @StrangeElement, когда-то возможно, что вам нужно удалить IP-хост отдельно от имени хоста. - Gonzalo Cao
Кроме того, он автоматически сохраняет резервную копию (на моей машине osx: Original contents retained as /Users/nha/.ssh/known_hosts.old, считая, что он одинаковый для Ubuntu). - nha
Кроме того, если вы используете нестандартный порт ssh, используйте этот формат ssh-keygen -R [ssh.sssshh.com]:1234 - Shiji.Jiang
Лучший ответ на этот вопрос. Работает как шарм - bademba


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


28
2018-01-10 06:00



Я понятия не имел, что он идентифицировал номер строки, это невероятно полезно. - deltree


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

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

vim ~/.ssh/known_hosts

и ударил

dd

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


18
2018-01-10 06:01



Вы можете использовать: set nu in vim для отображения номеров строк. В любом случае ответ Takkat - лучший. - Javier Rivera
Я согласен, не знаю, что вы могли бы это сделать. Я собираюсь использовать его в будущем. Я имел смысл искать номера строк для vim. Благодарю. - percent20


Использование 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

3
2018-03-24 22:24



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


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

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

Я получил эту битку волшебства

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

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


1
2018-02-20 00:37





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

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


0
2018-02-20 01:32



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