382 votes

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

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

Je finis souvent par supprimer l'intégralité du fichier known_hosts, ce que je n'ai aucun problème à faire, mais juste par curiosité, est-il possible de supprimer une seule entrée ?

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

Voici le message que j'ai rencontré, qui m'a amené à poser cette question :

Ajoutez la bonne clé d'hôte dans /home/wissen16/.ssh/known_hosts pour vous débarrasser de ce message.
La clé erronée dans /home/wissen16/.ssh/known_hosts:1
La clé d'hôte RSA pour foo.com a changé et vous avez demandé une vérification stricte.
Échec de la vérification de la clé d'hôte.

619voto

Takkat Points 135194

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

ssh-keygen -R nom_hôte

27 votes

Cela fonctionne également 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 pour le nom d'hôte personnalisé et l'adresse IP, j'ai dû supprimer les entrées pour les deux. Donc ssh-keygen -R xxx.xxx.xxx.xxx.

0 votes

Comme le dit @StrangeElement, il est parfois possible que vous deviez également supprimer l'hôte IP en plus du nom d'hôte.

6 votes

De plus, il fait automatiquement une sauvegarde (sur mon ordinateur osx : Contenu d'origine conservé sous /Users/nha/.ssh/known_hosts.old, en supposant que c'est la même chose pour Ubuntu).

35voto

lazy1 Points 3691

Oui, vous pouvez supprimer juste une clé. Il suffit de l'ouvrir dans un éditeur et de supprimer la ligne problématique. Le numéro après le deux-points dans le message d'erreur est le numéro de la ligne, c'est donc la ligne à supprimer -- la ligne 1 dans votre exemple.

1 votes

Je n'avais aucune idée qu'il identifiait le numéro de ligne, c'est incroyablement utile.

18voto

jd. Points 872

Je viens de commencer à utiliser les clés hôtes récemment, mais quand j'ai bidouillé avec elles, c'était généralement une clé par ligne. Donc sauvegardez le fichier et enlevez-les une à une jusqu'à trouver la bonne. Ensuite ajoutez les autres de nouveau. C'est un peu long, mais ça devrait marcher.

Aussi, en se basant sur cette erreur, et sans aucune idée de ce qui se passe, cela pourrait être la première clé hôte dans le fichier qui pose problème. Alors ouvrez le fichier avec vim

vim ~/.ssh/known_hosts

et appuyez sur

dd

puis enregistrez.

0 votes

Vous pouvez utiliser :set nu dans vim pour afficher les numéros de ligne. La réponse de Takkat est de toute façon la meilleure.

0 votes

Je suis d'accord je ne savais pas que vous pouviez faire ça. Je vais l'utiliser à l'avenir. Je voulais toujours regarder le paramètre des numéros de ligne pour vim. Merci.

3voto

dragon788 Points 1216

Utiliser ssh-keygen -R nomhôte ne fonctionnera pas toujours. Si vous avez une version plus récente de SSH qui "cache" les noms d'hôte pour prévenir le détournement de ssh-agent, apparemment ssh-keygen est incapable de déchiffrer le nom d'hôte.

Par exemple, j'ai un hôte appelé build-node-01 et je m'y suis connecté et j'ai accepté la clé. Ensuite, je le reconstruis à partir de zéro, obtenant une nouvelle empreinte d'hôte, et j'essaie de me reconnecter, je recevrai un avertissement qu'il y a un conflit à la ligne X (disons 3). J'exécute ssh-keygen -R nomhôte, 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 pour découvrir que le nom d'hôte était haché et apparaissait comme [1] Bu4Ch@R@4D0M57uFF au lieu d'un nom d'hôte lisible.

Dans ce cas, la seule façon de supprimer avec succès l'hôte problématique était d'utiliser

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

Pour pousser cette variation de sed un peu plus loin, vous pouvez souhaiter faire une sauvegarde du fichier known_hosts au cas où vous supprimeriez la mauvaise ligne, dans ce cas il suffit d'ajouter un .bak (ou une autre extension) à l'option -i pour créer une sauvegarde avec cette extension. En utilisant ssh-keygen, cela se fait automatiquement.

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

7 votes

Ceci n'est pas correct. ssh-keygen -R {hostname} fonctionnera, même lorsque les noms d'hôtes sont 'cachés' (hashés). Cependant, oui, on peut supprimer l'entrée par numéro (par exemple, la 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é, auquel cas, vous devrez formater la commande comme ceci (remarquez les guillemets) : ssh-keygen -R '[hostname]:2222'

0 votes

Il est bon de savoir @michael_n, il est très probable que ce soit un port non standard qui affectait ma capacité à supprimer l'entrée. Je voudrais aussi noter que si vous avez accepté plusieurs empreintes digitales pour un hôte, je ne suis pas sûr s'il supprime TOUTES les entrées à la fois, ou une par une.

1voto

Mark G B Points 61

Juste pour partager une autre réponse propre et facile que je viens de trouver. Supprimer le nom d'hôte n'est pas possible pour moi, car le fichier known_hosts est hashé. Cependant, je pourrais éditer manuellement l'entrée de l'hôte en fonction du numéro de ligne dans le message d'erreur. Comme l'a noté Mike Scott précédemment, le numéro de ligne de l'hôte offensant est dans le message d'erreur.

Ou, je peux faire ceci. À partir d'ici: comment réparer la clé offensante dans le fichier known_hosts du ssh

J'ai cette petite magie de cli

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

Remplacez le x par le numéro de ligne, et voilà. Il propose également une réponse en perl si le sed ne fonctionne pas.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X