Est-il possible de supprimer une clé d'hôte particulière du fichier SS_hosts de SSH?

310

Est-il possible de supprimer une clé d'hôte particulière du fichier SS_hosts de SSH?

Je finis habituellement par supprimer le known_hostsfichier entier , ce qui ne me pose aucun problème, mais par simple curiosité, est-il possible de supprimer une seule entrée?

J'ai ouvert le known_hostsfichier, mais j'ai du mal à comprendre son contenu.

Ci-dessous, le message auquel j'ai été confronté, qui m'a amené à poser cette question:

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
la source

Réponses:

515

Utilisez cette commande pour supprimer les entrées de known_hosts:

ssh-keygen -R hostname
Takkat
la source
21
Cela fonctionne aussi avec une adresse IP. Par exemple, j'ai un raccourci d'hôte DNS pour mon serveur Web. Pour supprimer un conflit que j'avais entre les clés du nom d'hôte personnalisé et l'adresse IP, je devais supprimer les entrées des deux. Ainsi, ssh-keygen -R xxx.xxx.xxx.xxx.
StrangeElement
Comme @StrangeElement le dit, il est parfois possible de supprimer également un hôte IP en dehors du nom d'hôte.
Gonzalo Cao
4
De plus, il garde une sauvegarde automatiquement (sur ma machine osx:, en Original contents retained as /Users/nha/.ssh/known_hosts.oldsupposant qu'il en soit de même pour Ubuntu).
nha
17
De plus, si vous utilisez un port ssh non standard, utilisez ce formatssh-keygen -R [ssh.sssshh.com]:1234
Shiji.J
La meilleure réponse à cette question. Fonctionne comme un charme
bademba
32

Oui, vous pouvez supprimer une seule clé. Ouvrez-le simplement dans un éditeur et supprimez la ligne incriminée. Le numéro après les deux points dans le message d'erreur est le numéro de la ligne, c'est donc la ligne à supprimer - la ligne 1 de votre exemple.

Mike Scott
la source
1
Je n'avais aucune idée qu'il identifiait le numéro de ligne, ce qui est incroyablement utile.
deltree
19

Ce n'est que récemment que j'ai commencé à utiliser les clés d'hôte, mais lorsque je les ai manipulées, il s'agit généralement d'une clé par ligne. Sauvegardez le fichier et supprimez-le un à la fois jusqu'à ce que vous trouviez la bonne. Ajoutez ensuite les autres. Un peu long chemin à faire, mais devrait fonctionner.

Également basé sur cette erreur, et sans aucune idée de ce qui se passait, il pourrait s'agir de la première clé d'hôte du fichier à l'origine du problème. Ouvrez-le avec vim.

vim ~/.ssh/known_hosts

et frapper

dd

puis enregistrez-le.

Buddy Lindsey
la source
Vous pouvez utiliser: set nu in vim pour afficher les numéros de ligne. Takkat répond est le meilleur de toute façon.
Javier Rivera
Je suis d'accord, je ne savais pas que tu pouvais faire ça. Je vais l'utiliser dans le futur. Je voulais continuer à chercher les paramètres de numéro de ligne pour vim. Merci.
Buddy Lindsey
3

L'utilisation de ssh-keygen -R nom_hôte ne fonctionnera pas toujours. Si vous utilisez une version plus récente de SSH qui "masque" les noms d'hôte pour empêcher le détournement de ssh-agent, apparemment, ssh-keygen est incapable de libérer le nom d'hôte.

Par exemple, j'ai un hôte appelé build-node-01 et je me suis connecté et j'ai accepté la clé. Je le reconstruis ensuite à partir de zéro, obtenant une nouvelle empreinte digitale d'hôte et j'essaie de me reconnecter. Je reçois un avertissement qu'il y a un conflit sur la ligne X (disons 3). Je cours ssh-keygen -R hostname, mais la prochaine fois que j'essaie de me connecter, je reçois toujours un avertissement qu'il y a un conflit. J'ai examiné le fichier uniquement pour découvrir que le nom d'hôte était haché et apparaissait sous la forme [1] Bu4Ch@R@4D0M57uFFd'un nom d'hôte lisible.

Dans ce cas, le seul moyen de supprimer l’hôte fautif consiste à utiliser

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

Pour aller un peu plus loin dans cette tâche, vous voudrez peut-être effectuer une sauvegarde de l’hôte known_hosts au cas où vous supprimeriez la mauvaise ligne. Dans ce cas, il suffit d’ajouter un fichier .bak (ou toute extension) à l’option -i pour créer une sauvegarde avec celle-ci. extension. Utiliser ssh-keygen fait cela automatiquement.

sed -i.bak 'xd' ~/.ssh/known_hosts
dragon788
la source
5
Ce n'est pas correct ssh-keygen -R {hostname}fonctionnera même lorsque les noms d’hôtes sont "cachés" (hachés). Pourtant, oui, on peut supprimer l'entrée par numéro (par exemple, 10ème entrée via sed -i.bak 10d ~/.ssh/known_hosts), mais ce n'est généralement pas nécessaire. Il se peut qu'un port non standard ait été utilisé. Dans ce cas, vous devrez peut-être formater la commande en tant que (guillemets de notes):ssh-keygen -R '[hostname]:2222'
michael
Bon à savoir @michael_n, il est très probable que c'était un port non standard qui affectait ma capacité à supprimer l'entrée. Je dois également noter que si vous avez accepté plusieurs empreintes digitales pour un hôte, je ne sais pas s'il supprime TOUTES les entrées à la fois, ou une seule à la fois.
dragon788
1

Juste pour partager une autre réponse claire et facile que je viens de trouver. La suppression du nom d’hôte est pour moi, car le fichier known_hosts est haché. Cependant, je pourrais éditer manuellement l'entrée de l'hôte en fonction du numéro de ligne indiqué dans le message d'erreur. Comme l'a noté précédemment Mike Scott, le numéro de ligne du nom d'hôte incriminé se trouve dans le message d'erreur.

Ou je peux le faire. À partir de là: comment réparer la clé incriminée dans le fichier ssh known_hosts

J'ai eu ce brin de magie

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

Remplacez le x par le numéro de ligne et le tour est joué. Il offre également une réponse perl si le sed ne fonctionne pas.

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

Dans ce cas, 10.20.120.211 est l'hôte que je veux supprimer de mon fichier known_hosts, assurez-vous d'échapper aux caractères spéciaux tels que (.)

Shan Valleru
la source
Les adresses IP et les noms d'hôte ne sont plus stockés textuellement (texte en clair) dans le fichier hosts connu, ce qui ne fonctionnera donc pas. On devrait soit utiliser ssh-keygen -R ...(de préférence); ou, sedavec le numéro de ligne spécifique à supprimer. De plus, pour vous mettre seden place, utilisez -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` pour supprimer la 10ème ligne et (éventuellement) conservez l'original dans un fichier de sauvegarde portant le suffixe .bak.
michael
0

Vous pouvez éviter de supprimer l'hôte particulier en le mettant à jour:

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

De cette façon, vous n'avez pas à vous reconnecter à l'hôte.

Pablo A
la source