É possível remover uma chave de host específica do arquivo known_hosts do SSH?

310

É possível remover uma chave de host específica do arquivo known_hosts do SSH?

Normalmente, acabo excluindo o known_hostsarquivo inteiro , o que não tenho problemas em fazer, mas apenas por curiosidade, é possível remover apenas uma única entrada?

Abri o known_hostsarquivo, mas estou tentando entender seu conteúdo.

Abaixo está a mensagem que enfrentei, o que me levou a fazer esta pergunta:

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
fonte

Respostas:

515

Use este comando para remover entradas de known_hosts:

ssh-keygen -R hostname
Takkat
fonte
21
Também funciona com um endereço IP. Por exemplo, eu tenho um atalho de host DNS para o meu servidor Web. Para remover um conflito que tive entre as chaves do nome do host personalizado e o endereço IP, tive que remover as entradas dos dois.
StrangeElement
Como o @StrangeElement diz, em algum momento é possível que você também precise remover o host IP além do nome do host.
Gonzalo Cao
4
Além disso, ele mantém um backup automaticamente (na minha máquina osx:, Original contents retained as /Users/nha/.ssh/known_hosts.oldsupondo que seja o mesmo para o Ubuntu).
nha
17
Além disso, se você estiver usando uma porta ssh não padrão, use este formatossh-keygen -R [ssh.sssshh.com]:1234
Shiji.J
A melhor resposta de sempre para esta pergunta. Funciona como um encanto
bademba
32

Sim, você pode remover apenas uma chave. Basta abri-lo em um editor e excluir a linha incorreta. O número após os dois pontos na mensagem de erro é o número da linha, portanto é a linha a ser excluída - linha 1 no seu exemplo.

Mike Scott
fonte
1
Eu não tinha ideia de que ele identificou o número da linha, o que é incrivelmente útil.
deltree 25/02
19

Recentemente, comecei a usar as chaves do host, mas quando as baguncei com elas, geralmente é uma chave por linha. Portanto, faça backup do arquivo e remova-o um de cada vez até encontrar o caminho certo. Em seguida, adicione os outros de volta. Muito pouco, mas deve funcionar.

Também com base nesse erro, e sem ter idéia do que nunca, poderia ser a primeira chave do host no arquivo que é o problema; portanto, abra o arquivo com o vim

vim ~/.ssh/known_hosts

e bateu

dd

então salve.

Buddy Lindsey
fonte
Você pode usar: defina nu no vim para mostrar os números das linhas. Resposta Takkat é a melhor de qualquer maneira.
Javier Rivera
Concordo que não sabia que você poderia fazer isso. Vou usá-lo no futuro. Eu mantive o significado de procurar a configuração dos números de linha do vim. obrigado.
amigos Lindsey
3

O uso do ssh-keygen -R hostname nem sempre funciona. Se você possui uma versão mais recente do SSH que está "ocultando" os nomes de host para impedir o seqüestro de agentes ssh, aparentemente o ssh-keygen não pode unhash o nome do host.

Por exemplo, eu tenho um host chamado build-node-01 e me conectei a ele e aceitei a chave. Depois, reconstruo-o do zero, obtendo uma nova impressão digital do host e tento reconectar, receberei um aviso de que há um conflito na linha X (digamos 3). Eu corro ssh-keygen -R hostname, mas na próxima vez que tento conectar, ainda recebo um aviso de que há um conflito. Examinei o arquivo apenas para descobrir que o nome do host estava em hash e apareceu como [1] Bu4Ch@R@4D0M57uFFum nome de host legível.

Nesse caso, a única maneira de remover com êxito o host infrator era usar

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

Para levar esse sed um passo adiante, convém fazer um backup dos known_hosts caso exclua a linha errada; nesse caso, basta adicionar um .bak (ou qualquer extensão) à opção -i para criar um backup com esse extensão. O uso do ssh-keygen faz isso automaticamente.

sed -i.bak 'xd' ~/.ssh/known_hosts
dragon788
fonte
5
Isso não está correto. ssh-keygen -R {hostname}funcionará, mesmo quando os nomes de host estiverem 'ocultos' (hash). Ainda assim, sim, é possível excluir a entrada pelo número (por exemplo, 10ª entrada via sed -i.bak 10d ~/.ssh/known_hosts), mas isso normalmente não é necessário. Pode ser que uma porta não padrão tenha sido usada; nesse caso, talvez você precise formatar o comando como (observe aspas):ssh-keygen -R '[hostname]:2222'
michael
É bom saber @michael_n, é muito provável que fosse uma porta não padrão que estava afetando minha capacidade de remover a entrada. Também devo observar que, se você aceitou várias impressões digitais de um host, não tenho certeza se ele remove TODAS as entradas de uma só vez ou apenas uma de cada vez.
precisa saber é o seguinte
1

Apenas para compartilhar outra resposta limpa e fácil que acabei de encontrar. A remoção do nome do host está fora de mim, pois o arquivo known_hosts está em hash. No entanto, eu PODE editar manualmente a entrada do host com base no número da linha na mensagem de erro. Conforme observado anteriormente por Mike Scott, o número da linha do nome do host incorreto está na mensagem de erro.

Ou, eu posso fazer isso. A partir daqui: como corrigir a chave incorreta no arquivo ssh known_hosts

Eu tenho esse pouco de magia cli

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

Substitua x pelo número da linha e pronto. Ele também oferece uma resposta perl se o sed não funcionar.

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

Nesse caso, 10.20.120.211 é o host que desejo excluir do meu arquivo known_hosts, certifique-se de escapar dos caracteres especiais como (.)

Shan Valleru
fonte
Endereços IP e nomes de host não são mais armazenados literalmente (texto não criptografado) no arquivo conhecido dos hosts, portanto, isso não funcionará. Deve-se usar ssh-keygen -R ...(de preferência); ou, sedcom o número da linha específico a ser excluído. Além disso, sedno local, use -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` para excluir a 10ª linha e (opcionalmente) mantenha o original em um arquivo de backup com o sufixo .bak.
22616 Michael
0

Você pode evitar remover o host específico, atualizando-o:

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

Dessa forma, você não precisa se conectar novamente ao host.

Pablo A
fonte