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


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

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

Ho aperto il known_hosts file, ma sto facendo fatica a capire il suo 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.

249
2018-01-10 05:56


origine




risposte:


Utilizzare questo comando per rimuovere le voci da known_hosts:

ssh-keygen -R hostname

424
2018-01-10 07:43



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 both.So ssh-keygen -R xxx.xxx.xxx.xxx. - StrangeElement
Come dice @StrangeElement, a volte è possibile rimuovere anche l'host IP dal nome host. - Gonzalo Cao
Inoltre, mantiene automaticamente un backup (sulla mia macchina osx: Original contents retained as /Users/nha/.ssh/known_hosts.old, assumendo che sia lo stesso per Ubuntu). - nha
Inoltre, se si utilizza la porta ssh non standard, utilizzare questo formato ssh-keygen -R [ssh.sssshh.com]:1234 - Shiji.Jiang
La migliore risposta di sempre per questa domanda. Funziona come un fascino - bademba


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


28
2018-01-10 06:00



Non avevo idea di aver identificato il numero della linea, che è incredibilmente utile. - deltree


Recentemente ho iniziato a utilizzare le chiavi host, ma quando ho incasinato con loro è generalmente una chiave per riga, quindi copia il file e rimuovilo uno alla volta fino a trovare quello giusto. Quindi aggiungi gli altri indietro. Un po 'di strada da fare, ma dovrebbe funzionare.

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

vim ~/.ssh/known_hosts

e colpisci

dd

quindi salvalo.


18
2018-01-10 06:01



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. Ho mantenuto il significato di cercare i numeri di linea che impostano per Vim. Grazie. - percent20


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

Ad esempio, ho un host chiamato build-node-01 e mi sono collegato ad esso e ho accettato la chiave. Quindi lo ricostruisco da zero, ottenendo una nuova impronta digitale host e provo a ricollegarmi, ricevo un avviso che c'è un conflitto sulla linea X (per esempio 3). io corro ssh-keygen -R hostname, ma la prossima volta che provo a connettermi ricevo comunque un avviso che c'è un conflitto. Ho esaminato il file solo per scoprire che il nome host era hash e si presentava come [1] Bu4Ch@R@4D0M57uFF invece di un nome host leggibile.

In questo caso, l'unico modo per ottenere l'host incriminato rimosso era quello di utilizzare

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

Per fare un passo avanti, potresti voler fare un backup di known_hosts nel caso in cui elimini la riga sbagliata, in questo caso basta aggiungere 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

3
2018-03-24 22:24



Questo non è corretto. ssh-keygen -R {hostname} funzionerà, anche quando i nomi degli host sono "nascosti" (hash). Ancora, sì, si può cancellare la voce per numero (ad es sed -i.bak 10d ~/.ssh/known_hosts), ma in genere non è necessario. Potrebbe essere che sia stata utilizzata una porta non standard, nel qual caso potrebbe essere necessario formattare il comando come (virgolette): 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. Devo 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


Solo per condividere un'altra risposta semplice e pulita che ho appena trovato. Rimozione del nome host è fuori per me, come il file known_hosts è 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 dell'hostname è presente nel messaggio di errore.

Oppure, posso farlo. Da qui: come risolvere la chiave offendente nel file ssh known_hosts

Ho ricevuto questo pezzetto di magia magica

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

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


1
2018-02-20 00:37





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 (.)


0
2018-02-20 01:32



Gli indirizzi IP e nomi host non vengono più memorizzati verbatim (testo non crittografato) nel file hosts conosciuto, quindi non funzionerà. Uno dovrebbe usare ssh-keygen -R ... (preferibilmente); o, sed con il numero di riga specifico da eliminare. Anche a sed sul posto, utilizzare -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` per eliminare la decima riga e (facoltativamente) mantenere l'originale in un file di backup con suffisso .bak. - michael