Apakah mungkin untuk menghapus kunci host tertentu dari file SSH's known_hosts?

310

Apakah mungkin untuk menghapus kunci host tertentu dari file SSH's known_hosts?

Saya biasanya berakhir menghapus seluruh known_hostsfile, yang saya tidak punya masalah dengan melakukan, tetapi hanya karena penasaran, apakah mungkin untuk menghapus hanya satu entri?

Saya membuka known_hostsfile, tetapi saya berjuang untuk memahami isinya.

Di bawah ini adalah pesan yang saya hadapi, yang membuat saya menanyakan pertanyaan ini:

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
sumber

Jawaban:

515

Gunakan perintah ini untuk menghapus entri dari known_hosts:

ssh-keygen -R hostname
Takkat
sumber
21
Ia bekerja dengan alamat IP juga. Misalnya, saya memiliki pintasan host DNS untuk server Web saya. Untuk menghapus konflik yang saya miliki antara tombol untuk custom hostname dan alamat IP, saya harus menghapus entri untuk keduanya. Jadi ssh-keygen -R xxx.xxx.xxx.xxx.
StrangeElement
Seperti yang dikatakan @StrangeElement, kadang-kadang Anda harus menghapus juga IP host selain dari nama host.
Gonzalo Cao
4
Plus, itu membuat cadangan secara otomatis (pada mesin osx saya:, Original contents retained as /Users/nha/.ssh/known_hosts.oldanggap itu sama untuk Ubuntu).
nha
17
Plus, jika Anda menggunakan port ssh non-standar, gunakan format inissh-keygen -R [ssh.sssshh.com]:1234
Shiji.J
Jawaban terbaik untuk pertanyaan ini. Bekerja seperti pesona
bademba
32

Ya, Anda dapat menghapus hanya satu kunci. Cukup buka di editor dan hapus baris yang menyinggung. Nomor setelah titik dua dalam pesan kesalahan adalah nomor baris, jadi itu baris yang akan dihapus - baris 1 dalam contoh Anda ..

Mike Scott
sumber
1
Saya tidak tahu itu mengidentifikasi nomor baris, yang sangat membantu.
deltree
19

Saya baru-baru ini mulai menggunakan kunci host, tetapi ketika saya telah mengacaukannya, biasanya satu kunci per baris jadi buat cadangan file dan hapus satu per satu sampai Anda menemukan yang tepat. Kemudian tambahkan yang lain kembali. Sedikit jalan panjang untuk melakukannya, tetapi harus berhasil.

Juga didasarkan pada kesalahan itu, dan tanpa tahu apa yang pernah terjadi, itu bisa menjadi kunci host pertama dalam file yang merupakan masalah sehingga buka file dengan vim

vim ~/.ssh/known_hosts

dan tekan

dd

lalu simpan.

Buddy Lindsey
sumber
Anda dapat menggunakan: set nu in vim untuk menampilkan nomor baris. Takkat jawaban adalah yang terbaik pula.
Javier Rivera
Saya setuju tidak tahu Anda bisa melakukan itu. Saya akan menggunakannya di masa depan. Saya terus berusaha mencari pengaturan nomor baris untuk vim. Terima kasih.
Buddy Lindsey
3

Menggunakan ssh-keygen -R hostname tidak akan selalu berfungsi. Jika Anda memiliki versi SSH yang lebih baru yang "menyembunyikan" nama host untuk mencegah pembajakan ssh-agent, tampaknya ssh-keygen tidak dapat melepaskan nama host.

Sebagai contoh, saya memiliki host yang disebut build-node-01 dan saya telah terhubung dengannya dan menerima kuncinya. Saya kemudian membangunnya kembali dari awal, mendapatkan sidik jari host baru dan saya mencoba untuk menyambung kembali, saya akan mendapat peringatan bahwa ada konflik di jalur X (katakanlah 3). Saya berlari ssh-keygen -R hostname, tetapi saat berikutnya saya mencoba menghubungkan saya masih mendapat peringatan bahwa ada konflik. Saya memeriksa file hanya untuk menemukan bahwa nama host hash dan muncul sebagai [1] Bu4Ch@R@4D0M57uFFbukannya nama host yang dapat dibaca.

Dalam hal ini satu-satunya cara untuk berhasil menghapus host yang bersalah adalah dengan menggunakannya

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

Untuk mengambil langkah ini selangkah lebih jauh, Anda mungkin ingin membuat cadangan dari known_hosts jika Anda menghapus baris yang salah, dalam hal ini tambahkan saja .bak (atau ekstensi apa saja) ke opsi -i untuk membuat cadangan dengan itu perpanjangan. Menggunakan ssh-keygen melakukan ini secara otomatis.

sed -i.bak 'xd' ~/.ssh/known_hosts
dragon788
sumber
5
Ini tidak benar. ssh-keygen -R {hostname}akan bekerja, bahkan ketika nama host 'disembunyikan' (hash). Tetap, ya, seseorang dapat menghapus entri dengan nomor (misalnya, entri ke-10 via sed -i.bak 10d ~/.ssh/known_hosts), tetapi itu biasanya tidak diperlukan. Bisa jadi port non-standar digunakan, dalam hal ini, Anda mungkin harus memformat perintah sebagai (note note):ssh-keygen -R '[hostname]:2222'
michael
Baik untuk mengetahui @michael_n, sangat mungkin bahwa itu adalah port non-standar yang memengaruhi kemampuan saya untuk menghapus entri. Saya juga harus mencatat bahwa jika Anda telah menerima banyak sidik jari untuk sebuah host, saya tidak yakin apakah itu menghapus SEMUA entri sekaligus, atau hanya satu per satu.
dragon788
1

Sekedar berbagi jawaban bersih dan mudah yang baru saja saya temukan. Menghapus nama host tidak cocok untuk saya, karena file known_hosts di-hash. Namun, saya BISA secara manual mengedit entri host berdasarkan nomor baris dalam pesan kesalahan. Seperti dicatat oleh Mike Scott sebelumnya, nomor baris nama host yang menyinggung ada di pesan kesalahan.

Atau, saya bisa melakukan ini. Dari sini: cara memperbaiki kunci yang menyinggung di file ssh known_hosts

Saya mendapat sedikit cli magic ini

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

Ganti x dengan nomor baris, dan voila. Dia juga menawarkan jawaban perl jika sed tidak akan berfungsi.

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

Dalam hal ini, 10.20.120.211 adalah host yang ingin saya hapus dari file known_hosts saya, pastikan Anda keluar dari karakter khusus seperti (.)

Shan Valleru
sumber
Alamat IP & nama host tidak lagi disimpan kata demi kata (hapus teks) dalam file host yang dikenal, jadi ini tidak akan berfungsi. Seseorang harus menggunakan ssh-keygen -R ...(lebih disukai); atau, seddengan nomor baris tertentu untuk dihapus. Juga, untuk sedmenggantikannya, gunakan -i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` untuk menghapus baris ke-10, dan (secara opsional) menyimpan dokumen asli dalam file cadangan yang diakhiri dengan suffixed .bak.
michael
0

Anda dapat menghindari menghapus host tertentu dengan memperbaruinya:

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

Dengan cara ini Anda tidak perlu terhubung lagi ke host.

Pablo A
sumber