Можно ли удалить определенный ключ хоста из файла 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.
Я только недавно начал использовать ключи хоста, но когда я их перепутал, это, как правило, по одному ключу на строку, поэтому делайте резервную копию файла и удаляйте их по одному, пока не найдете нужный. Затем добавьте остальные обратно. Это долгий путь, но он должен работать.
Также, основываясь на этой ошибке и не зная, что это когда-либо, это может быть первый ключ хоста в файле, который является проблемой, поэтому откройте файл с помощью vim
vim ~/.ssh/known_hosts
и нажмите
dd
, затем сохраните его.
Используйте эту команду, чтобы удалить записи из известных_хостов:
ssh-keygen -R hostname
Вы можете избежать удаления конкретного хоста, обновив его:
ssh-keyscan -t ecdsa hostname >> ~/.ssh/known_hosts
Таким образом, вам не нужно снова подключаться к хосту.
Да, вы можете удалить только один ключ. Просто откройте его в редакторе и удалите оскорбительную строку. Число после двоеточия в сообщении об ошибке является номером строки, так что это строка для удаления - строка 1 в вашем примере ..
sed '/10\.20\.120\.211/d' ~/.ssh/known_hosts > temp && mv temp ~/.ssh/known_hosts
В этом случае 10.20.120.211 - это хост, который я хочу удалить из моего файла known_hosts, убедитесь, что вы избегаете специальных символов, таких как (.)
Используя ssh-keygen-R имя хоста будет не всегда работать. Если у Вас есть более новая версия SSH, который "скрывает" имена хостов для предотвращения угона ssh-агента, по-видимому, ssh-keygen не может не хешировать имя хоста.
Например, у меня есть хост, названный build-node-01, и я соединился с ним и принял ключ. Я затем восстанавливаю его с нуля, получая новый цифровой отпечаток хоста, и я пытаюсь снова соединиться, я получу предупреждение, что существует конфликт на строке X (скажите 3). Я работаю ssh-keygen -R hostname
, но в следующий раз, когда я пытаюсь соединиться, я все еще получаю предупреждение, что существует конфликт. Я исследовал файл только, чтобы обнаружить, что имя хоста было хешировано и обнаружилось как [1] Bu4Ch@R@4D0M57uFF
вместо читаемого имени хоста.
В этом случае единственный способ успешно удалить незаконный хост состоял в том, чтобы использовать
sed -i 'xd' ~/.ssh/known_hosts
Для взятия этого sed один шаг вперед можно хотеть сделать резервное копирование known_hosts в случае, если Вы удаляете неправильную строку, в этом случае просто добавьте .bak (или любое расширение) к-i опции создать резервное копирование с тем расширением. Используя ssh-keygen делает это автоматически.
sed -i.bak 'xd' ~/.ssh/known_hosts
Просто чтобы поделиться еще одним простым и понятным ответом, который я только что нашел. Удаление имени хоста мне не подходит, так как файл known_hosts хэшируется. Тем не менее, я мог бы вручную отредактировать запись хоста на основе номера строки в сообщении об ошибке. Как уже отмечал Майк Скотт, номер строки имени хоста, который нарушил работу, указан в сообщении об ошибке.
Или я могу это сделать. Отсюда: как исправить ошибочный ключ в файле ssh known_hosts
Я получил этот кусочек магии
sed -i 'xd' ~/.ssh/known_hosts
Замените x на номер строки и вуаля , Он также предлагает perl-ответ, если sed не сработает.
Если вы хотите удалить ключ хоста для определенного ip, то это поможет:
ssh-keygen -f "~/.ssh/known_hosts" -R "49.12.89.136"