¿Es posible eliminar una clave de host particular del archivo conocido_hosts de SSH?
Por lo general, termino eliminando todo el known_hosts
archivo, que no tengo problemas para hacer, pero solo por curiosidad, ¿es posible eliminar solo una entrada?
Abrí el known_hosts
archivo, 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.
Original contents retained as /Users/nha/.ssh/known_hosts.old
suponiendo que sea lo mismo para Ubuntu).ssh-keygen -R [ssh.sssshh.com]:1234
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.
fuente
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.
fuente
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@4D0M57uFF
lugar de un nombre de host legible.En este caso, la única forma de eliminar con éxito el host infractor era usar
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.
fuente
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 desed -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'
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
Reemplace la x con el número de línea y listo. También ofrece una respuesta perl si el sed no funciona.
fuente
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 (.)
fuente
ssh-keygen -R ...
(preferiblemente); o,sed
con el número de línea específico para eliminar. Además,sed
en 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
.Puede evitar eliminar el host particular actualizándolo:
De esta manera, no tiene que volver a conectarse al host.
fuente