Как работать с моим файлом .ssh / known_hosts

47

Я запускаю рабочий стол Ubuntu с кучей виртуальных серверов в Virtual Box для тестирования и т. Д. В прошлом я также подключался к другим типам удаленных VPS Linux-боксов. В настоящее время мой .ssh/known_hostsфайл содержит целую кучу ключей, большинство из которых больше не используются.

Я хочу очистить свой .ssh/known_hostsфайл, но как узнать, какой ключ принадлежит какому хосту? Т.е. как мне узнать, какие ключи я могу безопасно удалить, а какие оставить?

Люк
источник

Ответы:

64

Чтобы узнать, какая запись для известного имени хоста в known_hosts:

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

Чтобы удалить одну запись из known_hosts:

 # ssh-keygen -R <hostname or IP address>
mikehapner
источник
27

Если у вас есть список всех ваших хостов, вы можете сделать что-то вроде

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

Это заменит ваш файл .ssh / known_hosts на новый, сгенерированный на основе сканирования хостов.

А также делайте то, что предлагает другой; HashKnownHosts больше раздражает, чем помогает здесь.

Freiheit
источник
ssh-keyscanимеет очень строгие правила форматирования list_of_hostsфайла. Это должен быть просто адрес, а не другие пробелы после LF после каждого адреса. Это включает в себя LF после последнего адреса. В противном случае вы получите много мусора в сгенерированном файле.
Nux
21

С трудом...

Ubuntu по умолчанию хэширует имена хостов в файле known_hosts (это не стандартное поведение openssh), чтобы любому, кто читает файл, было трудно узнать, к каким системам вы обращаетесь.

Если вы действительно хотите очистить файл, возможно, самый простой вариант - просто удалить его и проверить ключи тех серверов, о которых вы знаете, по мере их появления, но на самом деле я бы просто оставил known_hosts в покое.

Вы можете остановить хэширование новых записей хостов, закомментировав параметр в / etc / ssh / ssh_config

#HashKnownHosts yes
theotherreceive
источник
Очистка ~ / .ssh / known_hosts также помогает, когда конфигурация удаленного хоста изменяется и ssh показывает предупреждение. Однако следует быть осторожным с этим и игнорировать предупреждение только для доверенных хостов.
Алекс
6
Лучшим вариантом может быть объяснение того, как сгенерировать хеш для определенного имени хоста, что позволяет ему искать этот хеш в known_hosts, чтобы он мог обновить его.
Cerin
1
После внесения изменений просто добавьте новую запись, например, подключившись к новому серверу с помощью ssh root@something-new-or-new-dns-alias. Это обновит исходный known_hostsфайл и расшифрует имена хостов / IP-адреса.
Nux
2

У меня было более 300 устаревших записей в моем файле known_hosts. Не уверен, что он будет работать для всех систем (или даже для большинства систем), но вот мой сценарий вопросов и ответов. Возможно, вам придется настроить соответствующие строки или местоположение.

#!/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
user1953828
источник
Это не работает с хэшированным known_hostsфайлом, и поскольку спрашивающий спрашивает: «Как я узнаю, какой ключ принадлежит какому хосту», я думаю, очень вероятно, что его файл хэширован. Он говорит, что он в Ubuntu, и, как theotherreceiveговорится, Ubuntu хеширует по умолчанию.
Нил Мэйхью