È possibile rimuovere una particolare chiave host dal file known_hosts di SSH?


310

È possibile rimuovere una particolare chiave host dal file known_hosts di SSH?

Di solito finisco per eliminare l'intero known_hostsfile, cosa che non ho problemi a fare, ma solo per curiosità, è possibile rimuovere solo una singola voce?

Ho aperto il known_hostsfile, ma faccio fatica a comprenderne il contenuto.

Di seguito è il messaggio che ho affrontato, che mi ha portato a porre questa domanda:

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.

Risposte:


515

Utilizzare questo comando per rimuovere le voci da known_hosts:

ssh-keygen -R hostname

21
Funziona anche con un indirizzo IP. Ad esempio, ho un collegamento host DNS per il mio server Web. Per rimuovere un conflitto tra le chiavi per il nome host personalizzato e l'indirizzo IP, ho dovuto rimuovere le voci per entrambi. Quindi ssh-keygen -R xxx.xxx.xxx.xxx.
StrangeElement

Come dice @StrangeElement, a volte è possibile che sia necessario rimuovere anche l'host IP oltre al nome host.
Gonzalo Cao,

4
Inoltre, mantiene automaticamente un backup (sulla mia macchina osx: Original contents retained as /Users/nha/.ssh/known_hosts.oldsupponendo che sia lo stesso per Ubuntu).
nha

17
Inoltre, se si utilizza una porta ssh non standard, utilizzare questo formatossh-keygen -R [ssh.sssshh.com]:1234
Shiji.J

La migliore risposta di sempre per questa domanda. Funziona come un incantesimo
bademba

32

Sì, puoi rimuovere solo una chiave. Basta aprirlo in un editor ed eliminare la riga offensiva. Il numero dopo i due punti nel messaggio di errore è il numero di riga, quindi questa è la riga da eliminare - riga 1 nell'esempio.


1
Non avevo idea che identificasse il numero di riga, che è incredibilmente utile.
deltree,

19

Di recente ho iniziato a utilizzare la chiave host, ma quando ho sbagliato con loro è generalmente una chiave per riga, quindi esegui il backup del file e rimuovili uno alla volta fino a trovare quello giusto. Quindi aggiungere nuovamente gli altri. Un po 'di strada lunga per farlo, ma dovrebbe funzionare.

Anche in base a quell'errore, e senza alcuna idea di cosa mai, potrebbe essere la prima chiave host nel file che è il problema, quindi apri il file con vim

vim ~/.ssh/known_hosts

e colpire

dd

quindi salvalo.


Puoi usare: imposta nu in vim per mostrare i numeri di riga. La risposta di Takkat è comunque la migliore.
Javier Rivera,

Sono d'accordo non sapevo che potevi farlo. Lo userò in futuro. Continuavo a cercare le impostazioni dei numeri di riga per vim. Grazie.
Buddy Lindsey,

3

L'uso di ssh-keygen -R hostname non funzionerà sempre. Se si dispone di una versione più recente di SSH che "nasconde" i nomi host per impedire il dirottamento di ssh-agent, apparentemente ssh-keygen non è in grado di cancellare il nome host.

Ad esempio, ho un host chiamato build-node-01 e mi sono collegato ad esso e ho accettato la chiave. Poi lo ricostruisco da zero, ottenendo una nuova impronta digitale dell'host e provo a riconnettermi, riceverò un avviso che c'è un conflitto sulla linea X (diciamo 3). Corro ssh-keygen -R hostname, ma la prossima volta che provo a connettermi ricevo ancora un avviso che c'è un conflitto. Ho esaminato il file solo per scoprire che il nome host è stato sottoposto a hash e mostrato come [1] Bu4Ch@R@4D0M57uFFinvece di un nome host leggibile.

In questo caso, l'unico modo per rimuovere correttamente l'host offensivo era utilizzare

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

Per fare questo passo avanti, potresti voler fare un backup dei known_hosts nel caso in cui elimini la linea sbagliata, in questo caso aggiungi semplicemente un .bak (o qualsiasi estensione) all'opzione -i per creare un backup con quello estensione. L'uso di ssh-keygen lo fa automaticamente.

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

5
Questo non è corretto ssh-keygen -R {hostname}funzionerà, anche quando i nomi host sono "nascosti" (hash). Tuttavia, sì, è possibile eliminare la voce in base al numero (ad esempio, la decima voce tramite sed -i.bak 10d ~/.ssh/known_hosts), ma in genere non è necessario. È possibile che sia stata utilizzata una porta non standard, nel qual caso potrebbe essere necessario formattare il comando come (virgolette delle note):ssh-keygen -R '[hostname]:2222'
michael

Buono a sapersi @michael_n, è molto probabile che fosse una porta non standard che stava influenzando la mia capacità di rimuovere la voce. Dovrei anche notare che se hai accettato più impronte digitali per un host, non sono sicuro che rimuova TUTTE le voci contemporaneamente o solo una alla volta.
dragon788,

1

Solo per condividere un'altra risposta chiara e facile che ho appena trovato. La rimozione del nome host è per me, poiché il file known_hosts è sottoposto a hash. Tuttavia, POTREI modificare manualmente la voce host in base al numero di riga nel messaggio di errore. Come notato in precedenza da Mike Scott, il numero di riga del nome host offensivo è nel messaggio di errore.

Oppure posso farlo. Da qui: come riparare la chiave offensiva nel file ssh known_hosts

Ho un po 'di magia cli

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

Sostituisci la x con il numero di riga e voilà. Offre anche una risposta perl se la sed non funzionerà.


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

In questo caso, 10.20.120.211 è l'host che voglio eliminare dal mio file known_hosts, assicurati di sfuggire ai caratteri speciali come (.)


Gli indirizzi IP e i nomi host non vengono più archiviati alla lettera (testo in chiaro) nel file hosts noto, quindi non funzionerà. Uno dovrebbe usare ssh-keygen -R ...(preferibilmente); oppure, sedcon il numero di riga specifico da eliminare. Inoltre, sul sedposto, utilizzare -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` per eliminare la decima riga e (facoltativamente) conservare l'originale in un file di backup con il suffisso .bak.
michael,

0

Puoi evitare di rimuovere l'host specifico aggiornandolo:

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

In questo modo non è necessario riconnettersi all'host.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.