Czy można usunąć określony klucz hosta z pliku znane_hosty SSH?

309

Czy można usunąć określony klucz hosta z pliku znane_hosty SSH?

Zwykle usuwam cały known_hostsplik, z którym nie mam problemów, ale z ciekawości, czy można usunąć tylko jeden wpis?

Otworzyłem known_hostsplik, ale staram się zrozumieć jego zawartość.

Poniżej znajduje się wiadomość, z którą się spotkałem, która skłoniła mnie do zadania tego pytania:

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.
theTuxRacer
źródło

Odpowiedzi:

514

Użyj tego polecenia, aby usunąć wpisy ze znanych hostów:

ssh-keygen -R hostname
Takkat
źródło
21
Działa również z adresem IP. Na przykład mam skrót hosta DNS dla mojego serwera WWW. Aby usunąć konflikt między kluczami niestandardowej nazwy hosta a adresem IP, musiałem usunąć wpisy dla obu. Więc ssh-keygen -R xxx.xxx.xxx.xxx.
StrangeElement
Jak mówi @StrangeElement, może się zdarzyć, że musisz usunąć także host IP oprócz nazwy hosta.
Gonzalo Cao,
4
Dodatkowo automatycznie zachowuje kopię zapasową (na moim komputerze z systemem OSX: Original contents retained as /Users/nha/.ssh/known_hosts.oldzakładając, że jest tak samo dla Ubuntu).
nha
17
Dodatkowo, jeśli używasz niestandardowego portu ssh, użyj tego formatussh-keygen -R [ssh.sssshh.com]:1234
Shiji.J
Najlepsza odpowiedź na to pytanie. Działa jak urok
bademba,
32

Tak, możesz usunąć tylko jeden klucz. Po prostu otwórz go w edytorze i usuń naruszającą linię. Liczba po dwukropku w komunikacie o błędzie jest numerem linii, więc jest to linia do usunięcia - linia 1 w twoim przykładzie.

Mike Scott
źródło
1
Nie miałem pojęcia, że ​​zidentyfikował numer linii, co jest niezwykle pomocne.
deltree,
19

Dopiero niedawno zacząłem używać kluczy hosta, ale kiedy pomieszałem z nimi, jest to zwykle jeden klucz na linię, więc wykonaj kopię zapasową pliku i usuwaj je pojedynczo, aż znajdziesz właściwy. Następnie dodaj pozostałe z powrotem. Trochę długa droga, aby to zrobić, ale powinna działać.

Również w oparciu o ten błąd i nie mając pojęcia, co to może być pierwszy klucz hosta w pliku, który jest problemem, więc otwórz plik za pomocą vima

vim ~/.ssh/known_hosts

i uderzył

dd

następnie zapisz to.

Buddy Lindsey
źródło
Możesz użyć: set nu in vim, aby wyświetlić numery linii. Takkat odpowiedź i tak jest najlepsza.
Javier Rivera,
Zgadzam się, nie wiedziałem, że możesz to zrobić. Użyję go w przyszłości. Ciągle chciałem sprawdzić ustawienia numerów linii dla vima. dzięki.
Buddy Lindsey,
3

Używanie ssh-keygen -R nazwa hosta nie zawsze będzie działać. Jeśli masz nowszą wersję SSH, która „ukrywa” nazwy hostów, aby zapobiec przejęciu agenta ssh, najwyraźniej ssh-keygen nie jest w stanie odblokować nazwy hosta.

Na przykład mam hosta o nazwie build-node-01 i podłączyłem się do niego i zaakceptowałem klucz. Następnie odbudowuję go od zera, otrzymuję nowy odcisk palca hosta i próbuję się połączyć ponownie, otrzymam ostrzeżenie, że na linii X wystąpił konflikt (powiedzmy 3). Biegnę ssh-keygen -R hostname, ale przy następnej próbie połączenia nadal otrzymuję ostrzeżenie o konflikcie. Przejrzałem plik tylko po to, aby stwierdzić, że [1] Bu4Ch@R@4D0M57uFFnazwa hosta została zaszyfrowana i pojawiła się jako zamiast czytelnej nazwy hosta.

W takim przypadku jedynym sposobem, aby skutecznie usunąć winnego hosta, było użycie

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

Aby pójść o krok dalej, możesz wykonać kopię zapasową znanych_hostów na wypadek usunięcia niewłaściwej linii, w tym przypadku po prostu dodaj .bak (lub dowolne rozszerzenie) do opcji -i, aby utworzyć kopię zapasową z tym rozbudowa. Korzystanie z ssh-keygen robi to automatycznie.

sed -i.bak 'xd' ~/.ssh/known_hosts
dragon788
źródło
5
To nie jest poprawne. ssh-keygen -R {hostname}będzie działać, nawet gdy nazwy hostów są „ukryte” (mieszane). Tak, tak, można usunąć wpis według numeru (np. 10 wpis przez sed -i.bak 10d ~/.ssh/known_hosts), ale nie jest to zwykle konieczne. Możliwe, że użyto niestandardowego portu, w którym to przypadku konieczne może być sformatowanie polecenia jako (notowania):ssh-keygen -R '[hostname]:2222'
michael
Dobrze wiedzieć @michael_n, jest bardzo prawdopodobne, że był to niestandardowy port, który wpływał na moją możliwość usunięcia wpisu. Powinienem również zauważyć, że jeśli zaakceptowałeś wiele odcisków palców dla hosta, nie jestem pewien, czy usuwa WSZYSTKIE wpisy na raz, czy tylko jeden na raz.
dragon788,
1

Wystarczy podzielić się kolejną czystą i łatwą odpowiedzią, którą właśnie znalazłem. Usunięcie nazwy hosta jest dla mnie dostępne, ponieważ plik znany_hosts jest zaszyfrowany. MOGĘ jednak ręcznie edytować wpis hosta na podstawie numeru wiersza w komunikacie o błędzie. Jak zauważył wcześniej Mike Scott, obrażający numer wiersza nazwy hosta znajduje się w komunikacie o błędzie.

Albo mogę to zrobić. Stąd: jak naprawić obrażający klucz w pliku ssh known_hosts

Mam trochę magii cli

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

Zamień x na numer linii i voila. Oferuje również perlową odpowiedź, jeśli sed nie zadziała.

Corvus B.
źródło
0
sed '/10\.20\.120\.211/d' ~/.ssh/known_hosts > temp && mv temp ~/.ssh/known_hosts

W tym przypadku 10.20.120.211 jest hostem, który chcę usunąć z mojego pliku znane_hosty, pamiętaj, aby uciec od znaków specjalnych, takich jak (.)

Shan Valleru
źródło
Adresy IP i nazwy hostów nie są już przechowywane dosłownie (czysty tekst) w znanym pliku hosts, więc to nie zadziała. Należy albo użyć ssh-keygen -R ...(najlepiej); lub sedz określonym numerem wiersza do usunięcia. Ponadto, sedw miejscu, użyj -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts`, aby usunąć 10. linię i (opcjonalnie) zachować oryginał w pliku kopii zapasowej z przyrostkiem .bak.
Michael
0

Możesz uniknąć usunięcia określonego hosta, aktualizując go:

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

W ten sposób nie musisz ponownie łączyć się z hostem.

Pablo A.
źródło