it-swarm-id.com

Bagaimana cara mengelola file .ssh / known_hosts saya

Saya menjalankan desktop Ubuntu dengan sekelompok server virtual di Virtual Box untuk menguji hal-hal, dll. Di masa lalu saya juga telah terhubung ke jenis lain dari kotak VPS Linux jarak jauh. Saat ini file .ssh/known_hosts Saya memiliki sejumlah kunci di dalamnya, yang sebagian besar tidak digunakan lagi.

Saya ingin membersihkan file .ssh/known_hosts Saya, tetapi bagaimana saya tahu kunci mana yang dimiliki host mana? Yaitu. bagaimana saya tahu kunci mana yang dapat saya lepaskan dengan aman dan mana yang harus saya tinggalkan sendiri?

49
Luke

Untuk mengetahui entri mana yang merupakan nama host yang dikenal di known_hosts:

 # ssh-keygen -H  -F <hostname or IP address>

Untuk menghapus satu entri dari known_hosts:

 # ssh-keygen -R <hostname or IP address>
67
mikehapner

Jika Anda memiliki daftar semua host Anda, Anda dapat melakukan sesuatu seperti

ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts

Itu akan menimpa file .ssh/known_hosts Anda dengan yang baru dibuat berdasarkan pemindaian host.

Dan juga melakukan apa yang disarankan oleh penerima; HashKnownHosts lebih mengganggu daripada membantu di sini.

27
freiheit

Dengan susah payah ...

Ubuntu secara default mem-hash nama host pada file known_hosts (ini bukan perilaku openssh default), untuk mempersulit siapa pun yang membaca file untuk mengetahui sistem apa yang Anda akses.

Jika Anda benar-benar ingin membersihkan file, opsi paling sederhana mungkin hanya menghapusnya dan memeriksa kunci untuk server yang Anda tahu saat mereka muncul, tetapi sebenarnya saya hanya akan meninggalkan known_hosts sendirian.

Anda dapat menghentikan entri host baru dari hash dengan mengomentari opsi di/etc/ssh/ssh_config

#HashKnownHosts yes
21
theotherreceive

Saya memiliki lebih dari 300 entri lama yang sudah basi di file known_hosts saya. Tidak yakin itu akan bekerja untuk semua sistem (atau bahkan sebagian besar sistem) tetapi di sini adalah skrip Q&D saya. Anda mungkin harus menyesuaikan string atau lokasi yang cocok.

#!/bin/sh
list=`cat ~/.ssh/known_hosts | awk '{print $1}' |sed -e 's/,/ /g' | sort -u `

listsorted=$(printf "%s\n" ${list[@]} | sort -u)
echo $listsorted
#listsorted="10.2.10.1"
echo > /tmp/sshstat.txt
for Host in $listsorted ;
do
echo $Host 
ssh -oBatchMode=yes -oConnectTimeout=2  [email protected]${Host} "exit" >/tmp/sshstat.txt 2>&1 
ret=$?
if [ $ret -ne 0 ]; then
     echo "Failed: $Host"
     echo sed -i.bak \"/$Host/d\" "~/.ssh/known_hosts" | sh
else
    grep "Offending RSA" /tmp/sshstat.txt |  sed -e 's/:/ /g' | awk '{printf "sed -i.bak -e \"%dd\" %s  \n", $6, "~/.ssh/known_hosts" }' | sh
   fi
done
#echo $list
2
user1953828