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
|