Чи можливо видалити конкретний хост-ключ з файлу знаних_хостів SSH?


309

Чи можливо видалити конкретний хост-ключ з файлу знаних_хостів 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.

Відповіді:


514

Використовуйте цю команду для видалення записів із відомих_хостів:

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).
Nha

17
Крім того, якщо ви використовуєте нестандартний порт ssh, використовуйте цей форматssh-keygen -R [ssh.sssshh.com]:1234
Shiji.J

Найкраща відповідь на це питання. Працює як шарм
бадемба

32

Так, ви можете видалити лише одну клавішу. Просто відкрийте його в редакторі та видаліть порушуючи рядок. Число після двокрапки у повідомленні про помилку - це номер рядка, тож це рядок для видалення - рядок 1 у вашому прикладі.


1
Я не мав уявлення, що він визначив номер рядка, що неймовірно корисно.
deltree

19

Я нещодавно почав використовувати ключі хоста, але коли я поспілкувався з ними, це, як правило, одна клавіша на рядок, тому створіть резервні копії файлів і видаліть їх по одному, поки ви не знайдете потрібний. Потім додайте інші. Трохи довгий шлях для цього, але треба працювати.

Також на основі цієї помилки, і не маючи уявлення про те, що коли-небудь, це може бути першим ключем хосту у файлі, який є проблемою, тому відкрийте файл із vim

vim ~/.ssh/known_hosts

і вдарити

dd

потім збережіть його.


Ви можете використовувати: встановити nu in vim для показу номерів рядків. Відповідь Таккат найкраще.
Хав'єр Рівера

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

3

Використання 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 на крок далі, ви можете зробити резервну копію знаних_хостів, якщо ви видалите неправильну лінію, у цьому випадку просто додайте .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

Приємно знати @michael_n, дуже ймовірно, що це був нестандартний порт, який впливав на мою здатність видалити запис. Я також повинен зазначити, що якщо ви прийняли кілька відбитків пальців для хоста, я не впевнений, чи він видаляє ВСІ записи, або лише один за одним.
dragon788

1

Просто поділитися ще однією чистою та легкою відповіддю, яку я щойно знайшов. Для мене видалення імені хоста, оскільки хеш-файл файла known_hosts. Однак я МОЖУ Вручну відредагувати хост-запис на основі номера рядка в повідомленні про помилку. Як зазначав Майк Скотт раніше, номер рядка імені хоста, що порушує, міститься в повідомленні про помилку.

Або я можу це зробити. Звідси: як виправити ключ образи у файлі ssh unknown_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 - хост, який я хочу видалити з файлу знаних_хостів, переконайтесь, що ви уникаєте спеціальних символів типу (.)


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.