Я запускаю рабочий стол Ubuntu с кучей виртуальных серверов в Virtual Box для тестирования и т. Д. В прошлом я также подключался к другим типам удаленных VPS-серверов Linux. В настоящее время мой .ssh/known_hosts
В файле есть целая куча ключей, большинство из которых больше не используются.
Я хочу привести в порядок свой .ssh/known_hosts
файл, но как мне узнать, какой ключ принадлежит какому хосту? Т.е. как узнать, какие ключи я могу безопасно удалить, а какие оставить в покое?
Чтобы узнать, какая запись предназначена для известного имени хоста в known_hosts:
# ssh-keygen -H -F <hostname or IP address>
Чтобы удалить одну запись из known_hosts:
# ssh-keygen -R <hostname or IP address>
Если у вас есть список всех ваших хостов, вы можете сделать что-то вроде
ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts
Это перезапишет ваш файл .ssh / known_hosts на новый, созданный на основе сканирования хостов.
А также делайте то, что предлагает другой прием; HashKnownHosts здесь больше раздражает, чем помогает.
С трудом...
Ubuntu по умолчанию хеширует имена хостов файла known_hosts (это не поведение openssh по умолчанию), чтобы любому, кто читает файл, было сложно узнать, к каким системам вы получаете доступ.
Если вы действительно хотите очистить файл, самый простой вариант - это, вероятно, просто удалить его и проверить ключи для серверов, которые вы знаете по мере их появления, но на самом деле я бы просто оставил known_hosts в покое.
Вы можете запретить хеширование новых записей хостов, закомментировав параметр в / etc / ssh / ssh_config
#HashKnownHosts yes
В моем файле known_hosts было более 300 устаревших старых записей. Не уверен, что это будет работать для всех систем (или даже для большинства систем), но вот мой сценарий вопросов и ответов. Возможно, вам придется отрегулировать соответствующие строки или местоположение.
#!/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 root@${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