Ist es möglich, einen bestimmten Hostschlüssel aus der Datei known_hosts von SSH zu entfernen?

310

Ist es möglich, einen bestimmten Hostschlüssel aus der Datei known_hosts von SSH zu entfernen?

Ich lösche in der Regel die gesamte known_hostsDatei. Ich habe keine Probleme damit, aber kann ich aus Neugier nur einen einzigen Eintrag entfernen?

Ich habe die known_hostsDatei geöffnet , aber ich habe Mühe, den Inhalt zu verstehen.

Unten ist die Nachricht, mit der ich konfrontiert wurde und die mich dazu veranlasste, diese Frage zu stellen:

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
quelle

Antworten:

515

Verwenden Sie diesen Befehl, um Einträge von known_hosts zu entfernen:

ssh-keygen -R hostname
Takkat
quelle
21
Es funktioniert auch mit einer IP-Adresse. Beispielsweise habe ich eine DNS-Hostverknüpfung für meinen Webserver. Um einen Konflikt zu beseitigen, den ich zwischen den Schlüsseln für den benutzerdefinierten Hostnamen und der IP-Adresse hatte, musste ich die Einträge für beide entfernen. Also ssh-keygen -R xxx.xxx.xxx.xxx.
StrangeElement
Wie @StrangeElement sagt, kann es vorkommen, dass Sie neben dem Hostnamen auch den IP-Host entfernen müssen.
Gonzalo Cao
4
Außerdem wird automatisch ein Backup erstellt (auf meinem osx-Rechner: Original contents retained as /Users/nha/.ssh/known_hosts.oldvorausgesetzt, es ist dasselbe für Ubuntu).
nha
17
Wenn Sie einen nicht standardmäßigen SSH-Port verwenden, verwenden Sie dieses Formatssh-keygen -R [ssh.sssshh.com]:1234
Shiji.J
Die beste Antwort auf diese Frage. Funktioniert wie ein Zauber
bademba
32

Ja, Sie können nur einen Schlüssel entfernen. Öffnen Sie es einfach in einem Editor und löschen Sie die betreffende Zeile. Die Nummer nach dem Doppelpunkt in der Fehlermeldung ist die Zeilennummer, das ist also die zu löschende Zeile - Zeile 1 in Ihrem Beispiel.

Mike Scott
quelle
1
Ich hatte keine Ahnung, dass es die Zeilennummer identifiziert, das ist unglaublich hilfreich.
Deltree
19

Ich habe erst kürzlich angefangen, Host-Schlüssel zu verwenden, aber wenn ich mit ihnen rumgespielt habe, ist es im Allgemeinen ein Schlüssel pro Zeile, also sichern Sie die Datei und entfernen Sie sie nacheinander, bis Sie den richtigen finden. Fügen Sie dann die anderen wieder hinzu. Das ist ein langer Weg, sollte aber funktionieren.

Basierend auf diesem Fehler und ohne eine Ahnung zu haben, könnte dies der erste Hostschlüssel in der Datei sein, der das Problem darstellt. Öffnen Sie die Datei also mit vim

vim ~/.ssh/known_hosts

und schlagen

dd

dann speichere es.

Buddy Lindsey
quelle
Sie können Folgendes verwenden: Setzen Sie nu in vim, um die Zeilennummern anzuzeigen. Takkat Antwort ist sowieso die beste.
Javier Rivera
Ich stimme dir zu, dass du das nicht kannst. Ich werde es in Zukunft verwenden. Ich hatte weiterhin vor, die Einstellung der Zeilennummern für vim nachzuschlagen. Vielen Dank.
Buddy Lindsey
3

Die Verwendung von ssh-keygen -R hostname funktioniert nicht immer. Wenn Sie eine neuere Version von SSH haben, die die Hostnamen "versteckt", um die Entführung von ssh-agent zu verhindern, kann ssh-keygen den Hostnamen anscheinend nicht enthüllen.

Zum Beispiel habe ich einen Host mit dem Namen build-node-01 und habe eine Verbindung dazu hergestellt und den Schlüssel akzeptiert. Ich erstelle es dann von Grund auf neu, erhalte einen neuen Host-Fingerabdruck und versuche erneut, eine Verbindung herzustellen. Ich erhalte eine Warnung, dass in Zeile X ein Konflikt vorliegt (z. B. 3). Ich renne ssh-keygen -R hostname, aber wenn ich das nächste Mal versuche, eine Verbindung herzustellen, wird trotzdem eine Warnung angezeigt, dass ein Konflikt vorliegt. Ich habe die Datei nur untersucht, um festzustellen, dass der Hostname gehasht und [1] Bu4Ch@R@4D0M57uFFanstelle eines lesbaren Hostnamens angezeigt wurde.

In diesem Fall war die einzige Möglichkeit, den fehlerhaften Host erfolgreich zu entfernen, die Verwendung

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

Um noch einen Schritt weiter zu gehen, möchten Sie möglicherweise eine Sicherungskopie der known_hosts erstellen, falls Sie die falsche Zeile löschen. Fügen Sie in diesem Fall der Option -i einfach eine .bak-Datei (oder eine beliebige Erweiterung) hinzu, um eine Sicherungskopie zu erstellen Erweiterung. Mit ssh-keygen wird dies automatisch durchgeführt.

sed -i.bak 'xd' ~/.ssh/known_hosts
dragon788
quelle
5
Das ist nicht richtig. ssh-keygen -R {hostname}wird funktionieren, auch wenn Hostnamen 'versteckt' (gehasht) sind. Trotzdem kann man den Eintrag nach Nummer löschen (z. B. 10. Eintrag über sed -i.bak 10d ~/.ssh/known_hosts), aber das ist normalerweise nicht erforderlich. Möglicherweise wurde ein nicht standardmäßiger Port verwendet. In diesem Fall müssen Sie den Befehl möglicherweise wie ssh-keygen -R '[hostname]:2222'
folgt
Gut zu wissen, @michael_n, es ist sehr wahrscheinlich, dass es sich um einen nicht standardmäßigen Port handelte, der sich auf meine Fähigkeit auswirkte, den Eintrag zu entfernen. Wenn Sie mehrere Fingerabdrücke für einen Host akzeptiert haben, bin ich mir nicht sicher, ob ALLE Einträge gleichzeitig oder nur einzeln entfernt werden.
Dragon788
1

Nur um eine andere saubere und einfache Antwort zu teilen, die ich gerade gefunden habe. Das Entfernen des Hostnamens ist für mich nicht möglich, da die Datei known_hosts gehasht wird. Ich konnte jedoch den Host-Eintrag basierend auf der Zeilennummer in der Fehlermeldung manuell bearbeiten. Wie bereits von Mike Scott festgestellt, ist die Zeilennummer des Hostnamens in der Fehlermeldung enthalten.

Oder ich kann das tun. Von hier aus: wie man einen fehlerhaften Schlüssel in der Datei ssh known_hosts repariert

Ich habe dieses bisschen Cli-Magie

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

Ersetzen Sie das x durch die Zeilennummer und voila. Er bietet auch eine Perl-Antwort an, wenn der sed nicht funktioniert.

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

In diesem Fall ist 10.20.120.211 der Host, den ich aus meiner known_hosts-Datei löschen möchte. Stellen Sie sicher, dass Sie die Sonderzeichen wie (.) Maskieren.

Shan Valleru
quelle
IP-Adressen und Hostnamen werden nicht mehr wörtlich (Klartext) in der bekannten Hostdatei gespeichert, daher funktioniert dies nicht. Man sollte entweder ssh-keygen -R ...(vorzugsweise) verwenden; oder sedmit der zu löschenden Zeilennummer. Auch, um sedan Ort und Stelle, verwenden -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` der 10. Zeile zu löschen, und (optional) halten das Original in einer Sicherungsdatei angehängt durch .bak.
Michael
0

Sie können das Entfernen des bestimmten Hosts vermeiden, indem Sie ihn aktualisieren:

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

Auf diese Weise müssen Sie sich nicht erneut mit dem Host verbinden.

Pablo A
quelle