¿Es posible eliminar una clave de host particular del archivo conocido_hosts de SSH?

310

¿Es posible eliminar una clave de host particular del archivo conocido_hosts de SSH?

Por lo general, termino eliminando todo el known_hostsarchivo, que no tengo problemas para hacer, pero solo por curiosidad, ¿es posible eliminar solo una entrada?

Abrí el known_hostsarchivo, pero me cuesta entender su contenido.

A continuación se muestra el mensaje que enfrenté, lo que me llevó a hacer esta pregunta:

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
fuente

Respuestas:

515

Use este comando para eliminar entradas de conocido_hosts:

ssh-keygen -R hostname
Takkat
fuente
21
Funciona también con una dirección IP. Por ejemplo, tengo un acceso directo de host DNS para mi servidor web. Para eliminar un conflicto que tuve entre las claves para el nombre de host personalizado y la dirección IP, tuve que eliminar las entradas para ambos. Entonces ssh-keygen -R xxx.xxx.xxx.xxx.
StrangeElement
Como dice @StrangeElement, en algún momento es posible que deba eliminar también el host IP aparte del nombre de host.
Gonzalo Cao
44
Además, mantiene una copia de seguridad automáticamente (en mi máquina osx: Original contents retained as /Users/nha/.ssh/known_hosts.oldsuponiendo que sea lo mismo para Ubuntu).
nha
17
Además, si está utilizando un puerto ssh no estándar, use este formatossh-keygen -R [ssh.sssshh.com]:1234
Shiji.J
La mejor respuesta para esta pregunta. Funciona como un encanto
bademba
32

Sí, puede eliminar solo una clave. Simplemente ábralo en un editor y elimine la línea ofensiva. El número después de los dos puntos en el mensaje de error es el número de línea, así que esa es la línea a eliminar: la línea 1 en su ejemplo.

Mike Scott
fuente
1
No tenía idea de que identificaba el número de línea, eso es increíblemente útil.
deltree
19

Recientemente comencé a usar las claves de host, pero cuando las he manipulado, generalmente es una clave por línea, así que haga una copia de seguridad del archivo y elimínelas de una en una hasta que encuentre la correcta. Luego agrega los otros de nuevo. Un poco largo camino para hacerlo, pero debería funcionar.

También basado en ese error, y sin tener idea alguna, podría ser la primera clave de host en el archivo el problema, así que abra el archivo con vim

vim ~/.ssh/known_hosts

y golpear

dd

entonces guárdalo.

Buddy Lindsey
fuente
Puede usar: establecer nu en vim para mostrar los números de línea. La respuesta de Takkat es la mejor de todos modos.
Javier Rivera
Estoy de acuerdo en que no sabía que podías hacer eso. Lo voy a usar en el futuro. Seguí queriendo buscar la configuración de números de línea para vim. Gracias.
Buddy Lindsey
3

Usar ssh-keygen -R hostname no siempre funcionará. Si tiene una versión más nueva de SSH que está "ocultando" los nombres de host para evitar el secuestro de ssh-agent, aparentemente ssh-keygen no puede deshacer el nombre de host.

Por ejemplo, tengo un host llamado build-node-01 y me conecté a él y acepté la clave. Luego lo reconstruyo desde cero, obtengo una nueva huella digital del host e intento volver a conectarme, recibiré una advertencia de que hay un conflicto en la línea X (digamos 3). Corro ssh-keygen -R hostname, pero la próxima vez que intento conectarme sigo recibiendo una advertencia de que hay un conflicto. Examiné el archivo solo para descubrir que el nombre de host estaba cifrado y apareció en [1] Bu4Ch@R@4D0M57uFFlugar de un nombre de host legible.

En este caso, la única forma de eliminar con éxito el host infractor era usar

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

Para llevar este paso un paso más allá, es posible que desee hacer una copia de seguridad de conocido_hosts en caso de que elimine la línea incorrecta, en este caso simplemente agregue un .bak (o cualquier extensión) a la opción -i para crear una copia de seguridad con eso extensión. El uso de ssh-keygen hace esto automáticamente.

sed -i.bak 'xd' ~/.ssh/known_hosts
dragon788
fuente
55
Esto no es correcto. ssh-keygen -R {hostname}funcionará, incluso cuando los nombres de host estén 'ocultos' (hash). Aún así, sí, se puede eliminar la entrada por número (por ejemplo, 10ma entrada a través de sed -i.bak 10d ~/.ssh/known_hosts), pero eso no suele ser necesario. Podría ser que se utilizó un puerto no estándar, en cuyo caso, es posible que tenga que formatear el comando como (comillas de nota):ssh-keygen -R '[hostname]:2222'
michael
Es bueno saber @michael_n, es muy probable que se tratara de un puerto no estándar que estaba afectando mi capacidad para eliminar la entrada. También debo tener en cuenta que si ha aceptado varias huellas digitales para un host, no estoy seguro de si elimina TODAS las entradas a la vez, o solo una a la vez.
dragon788
1

Solo para compartir otra respuesta limpia y fácil que acabo de encontrar. Eliminar el nombre de host está fuera para mí, ya que el archivo known_hosts está en hash. Sin embargo, PODRÍA editar manualmente la entrada del host en función del número de línea en el mensaje de error. Como señaló Mike Scott anteriormente, el número de línea del nombre de host infractor se encuentra en el mensaje de error.

O puedo hacer esto. Desde aquí: cómo reparar la clave ofensiva en el archivo ssh known_hosts

Tengo este poco de cli magic

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

Reemplace la x con el número de línea y listo. También ofrece una respuesta perl si el sed no funciona.

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

En este caso, 10.20.120.211 es el host que quiero eliminar de mi archivo known_hosts, asegúrese de escapar de los caracteres especiales como (.)

Shan Valleru
fuente
Las direcciones IP y los nombres de host ya no se almacenan textualmente (texto claro) en el archivo de hosts conocido, por lo que esto no funcionará. Uno debería usar ssh-keygen -R ...(preferiblemente); o, sedcon el número de línea específico para eliminar. Además, seden el lugar, use -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` para eliminar la décima línea y (opcionalmente) mantener el original en un archivo de respaldo con el sufijo .bak.
michael
0

Puede evitar eliminar el host particular actualizándolo:

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

De esta manera, no tiene que volver a conectarse al host.

Pablo A
fuente