Método para resolver o erro do ssh "REMOTE HOST IDENTIFICATION CHANGED"

Um dos erros mais chatos para qualquer SysAdmin ou pessoa que acessa via ssh diversos servidores é o erro de "REMOTE HOST IDENTIFICATION CHANGE".

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
b4:7e:cd:28:9d:ec:d2:37:96:67:14:8b:25:bb:c6:eb.
Please contact your system administrator.
Add correct host key in /home/ataliba/.ssh/known_hosts to get rid of this message.
Offending key in /home/ataliba/.ssh/known_hosts:1
SA host key for 192.168.0.76 has changed and you have requested strict checking.
Host key verification failed.

			

Este erro normalmente acontece quando a chave pública que está no seu arquivo know_hosts não bate com a chave do servidor ( criada quando o ssh sobe pela primeira vez no boot do servidor ).

Há três métodos aceitáveis para se atacar este problema. Um, é abrir o arquivo know_hosts e deletar a linha que contém o ip ou host que você está tentando acessar. 

O outro, é utilizar algum script que faça esta limpeza. Exemplo, é o que está neste link aqui, e que eu inclusive cito abaixo. 

			#!/bin/bash
			DATA="`ssh $1 echo 2>&1|grep known_hosts:`"
			if [[ "$DATA" =~ ([^ ]+):([0-9]+) ]]
			then
			echo "SSH KeyCleaner v. 0.1";
			echo -n "Delete key from line"
			echo -n " ${BASH_REMATCH[2]} in"
			echo -n " ${BASH_REMATCH[1]}? "
			read -n1 -p"(y/n) : " A
			echo
			if [ "$A" == "y" ]
			then
			sed -i " ${BASH_REMATCH[2]}d"  ${BASH_REMATCH[1]}
			echo "Cleaning"
			fi;
			else
			echo "Bad output from ssh command. Sorry.";
			fi;
			
			

Para utilzar é bem fácil, é só colocar o conteúdo acima em um arquivo com o nome ssh_keyclean.sh  e dar permissão de execução para o mesmo “chmod +x /usr/bin/ssh_keyclean.sh”.

Assim que ele tiver permissão de execução, o uso é o explicado abaixo: 

$ ssh_keyclean.sh <ip_address>

Exemplo:

$ ssh_keyclean.sh 192.168.1.51

Ele roda o comando ssh, fazendo um grep da linha que contém "know_hosts". Ele usa uma função de regex interna do próprio bash para extrair duas variáveis: filename e linenumber. Após perguntar se você está certo disto, e se você realmente tiver certeza disto, ele usa o sed para eliminar a linha que foi reportada pelo ssh no arquivo ~/.ssh/know_hosts . 

E finalmente, o próprio ssh atualmente já faz isto para você.

Se quiser, é só usar o comando : ssh-keygen -R ip ou hostname e pronto, você está com tudo prontinho.

Ele elimina a linha que contém a chave que não bate com o servidor e na próxima vez que você logar no mesmo, ele irá lhe perguntar se quer guardar a chave no arquivo know_hosts. 

São os métodos que eu conheço para resolver este problema chato. Até hoje, não vi nenhum outro :-) 

Ah, e para resolver o último problema, do uso do ssh-keygen, segue um script que pode lhe ajudar para caramba :-) 

			#!/bin/sh
			if [ $# -lt 1 ]; then
			echo "Use: " 
			echo "    $0 ip "
			echo "    $0 hostname"
			exit 1
			fi
			echo "Cleaning your $HOME/.ssh/know_hosts"
			ssh-keygen -R $1