Tôi chạy một máy tính để bàn Ubuntu với một loạt các máy chủ ảo trong Virtual Box để kiểm tra các thứ, v.v. Trước đây tôi cũng đã kết nối với các loại hộp VPS Linux từ xa khác. Hiện tại tệp .ssh/known_hosts
Của tôi có cả đống khóa trong đó, hầu hết chúng không được sử dụng nữa.
Tôi muốn dọn sạch tệp .ssh/known_hosts
Của mình, nhưng làm cách nào để biết khóa nào thuộc về máy chủ nào? I E. Làm thế nào để tôi biết những phím nào tôi có thể gỡ bỏ một cách an toàn và những phím nào tôi nên để lại một mình?
Để tìm ra mục nhập nào dành cho tên máy chủ đã biết trong know_hosts:
# ssh-keygen -H -F <hostname or IP address>
Để xóa một mục duy nhất từ know_hosts:
# ssh-keygen -R <hostname or IP address>
Nếu bạn có một danh sách tất cả các máy chủ của mình, bạn có thể làm một cái gì đó như
ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts
Điều đó sẽ ghi đè lên tệp .ssh/know_hosts của bạn với tệp mới được tạo dựa trên việc quét các máy chủ.
Và cũng làm những gì nhiệt đới gợi ý; HashKnownhosts gây phiền nhiễu nhiều hơn là giúp đỡ ở đây.
Với khó khăn...
Ubuntu theo mặc định băm tên máy chủ lưu trữ tệp know_hosts (đây không phải là hành vi openssh mặc định), để gây khó khăn cho bất kỳ ai đọc tệp để biết bạn truy cập hệ thống nào.
Nếu bạn thực sự muốn xóa tệp, tùy chọn đơn giản nhất có lẽ chỉ là xóa nó và kiểm tra các khóa cho các máy chủ mà bạn biết khi chúng phát sinh, nhưng thực sự tôi chỉ để lại know_hosts.
Bạn có thể ngăn các mục lưu trữ mới khỏi bị băm bằng cách nhận xét tùy chọn trong/etc/ssh/ssh_config
#HashKnownHosts yes
Tôi đã có hơn 300 mục cũ cũ trong tập tin know_hosts của tôi. Không chắc chắn rằng nó sẽ hoạt động cho tất cả các hệ thống (hoặc thậm chí hầu hết các hệ thống) nhưng đây là tập lệnh Q & D của tôi. Bạn có thể phải điều chỉnh các chuỗi hoặc vị trí phù hợp.
#!/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