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


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

Eu geralmente acabo apagando todo known_hosts arquivo, que eu não tenho problemas em fazer, mas apenas por curiosidade, é possível remover apenas uma única entrada?

Eu abri o known_hosts arquivo, mas estou lutando para 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.

249
2018-01-10 05:56


origem




Respostas:


Use este comando para remover entradas de known_hosts:

ssh-keygen -R hostname

427
2018-01-10 07:43



Funciona com um endereço IP também. Por exemplo, eu tenho um atalho de host DNS para o meu servidor da Web. Para remover um conflito que tive entre as chaves para o nome de host personalizado e o endereço IP, tive que remover as entradas de ambos. So ssh-keygen -R xxx.xxx.xxx.xxx. - StrangeElement
Como diz @StrangeElement, às vezes é possível remover também o host IP do hostname. - Gonzalo Cao
Além disso, mantém um backup automaticamente (na minha máquina osx: Original contents retained as /Users/nha/.ssh/known_hosts.old, assumindo que é o mesmo para o Ubuntu). - nha
Além disso, se você estiver usando porta ssh não padrão, use este formato ssh-keygen -R [ssh.sssshh.com]:1234 - Shiji.Jiang
A melhor resposta para essa pergunta. Funciona como um encanto - bademba


Sim, você pode remover apenas uma chave. Basta abri-lo em um editor e excluir a linha ofensiva. O número após os dois pontos na mensagem de erro é o número da linha, então essa é a linha para excluir - linha 1 em seu exemplo.


28
2018-01-10 06:00



Eu não fazia ideia de identificar o número da linha, o que é incrivelmente útil. - deltree


Eu só recentemente comecei a usar a chave de host, mas quando eu tenho mexido com eles é geralmente uma chave por linha para o backup do arquivo e removê-los um de cada vez até encontrar o caminho certo. Em seguida, adicione os outros de volta. Pouco de um longo caminho para fazê-lo, mas deve funcionar.

Também com base nesse erro, e sem a menor idéia do que é, pode ser a primeira chave do host no arquivo que é o problema, então abra o arquivo com o vim

vim ~/.ssh/known_hosts

e acertar

dd

então salve.


18
2018-01-10 06:01



Você pode usar: definir nu no vim para mostrar os números de linha. A resposta do Takkat é a melhor de todas. - Javier Rivera
Eu concordo não sabia que você poderia fazer isso. Vou usá-lo no futuro. Eu continuei querendo procurar a configuração dos números de linha para o vim. obrigado. - percent20


Usar ssh-keygen -R nome do host nem sempre funcionará. Se você tem uma versão mais nova do SSH que está "ocultando" os nomes de host para evitar o seqüestro de ssh-agent, aparentemente o ssh-keygen não consegue desvendar o nome do host.

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

Nesse caso, a única maneira de obter com êxito o host incorreto removido era usar

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

Para levar este sed um passo adiante, você pode querer fazer um backup dos known_hosts no caso de você excluir a linha errada, neste caso basta adicionar um .bak (ou qualquer extensão) para a opção -i para criar um backup com esse extensão. Usando ssh-keygen faz isso automaticamente.

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

3
2018-03-24 22:24



Isso não está correto. ssh-keygen -R {hostname} funcionará, mesmo quando nomes de host estiverem 'ocultos' (hash). Ainda assim, sim, pode-se excluir a entrada por número (por exemplo, a 10ª entrada via sed -i.bak 10d ~/.ssh/known_hosts), mas isso não é normalmente necessário. Pode ser que uma porta não padrão tenha sido usada e, nesse caso, talvez seja necessário formatar o comando como (aspas de nota): ssh-keygen -R '[hostname]:2222' - michael
É bom saber que @michael_n, é muito provável que tenha sido 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 remove TODAS as entradas de uma vez ou apenas uma por vez. - dragon788


Apenas para compartilhar outra resposta limpa e fácil que acabei de encontrar. Removendo o nome do host é para mim, como o arquivo known_hosts é hash. No entanto, eu PODIA editar manualmente a entrada do host com base no número da linha na mensagem de erro. Como observado anteriormente por Mike Scott, o número da linha do nome do host incorreto está na mensagem de erro.

Ou posso fazer isso. Daqui: como corrigir chave ofensiva no arquivo ssh known_hosts

Eu peguei esse pouquinho de cli magic

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

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


1
2018-02-20 00:37





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

Neste caso, 10.20.120.211 é o host que eu quero excluir do meu arquivo known_hosts, certifique-se de escapar os caracteres especiais como (.)


0
2018-02-20 01:32



Endereços IP e nomes de host não são mais armazenados literalmente (texto não criptografado) no arquivo de hosts conhecidos, portanto, isso não funcionará. Um deve usar ssh-keygen -R ... (preferencialmente); ou, sed com o número de linha específico a ser excluído. Também para sed no local, use -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` para excluir a 10ª linha e (opcionalmente) manter o original em um arquivo de backup com sufixo .bak. - michael