it-swarm-vi.tech

Cách quản lý tệp .ssh / know_hosts của tôi

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?

49
Luke

Để 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>
67
mikehapner

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.

27
freiheit

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
21
theotherreceive

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
2
user1953828