Ответы:
Вы можете сделать это, комбинируя ssh-keyscan
и ssh-keygen
:
$ file=$(mktemp)
$ ssh-keyscan host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA)
$ rm $file
(к сожалению, намного проще ssh-keyscan host | ssh-keygen -l -f /dev/stdin
не работает)
ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
действительно работает так, как ожидалось в ssh-keygen 7.2 и выше. Он производит несколько строк комментариев к STDERR, которые могут быть отфильтрованы, как упоминалось в ответе Энтони Геогегана илиssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Мне недавно пришлось сделать это самому, поэтому я решил добавить ответ, который показывает, как это можно сделать (с версиями OpenSSH 7.2 или новее ) в одну строку, используя подстановку процессов:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Следующий текст объясняет, как работают эти команды, и выделяет некоторые различия в поведении между старыми и новыми версиями утилит OpenSSH.
Команда ssh-keyscan
была разработана таким образом, чтобы пользователи могли получать открытые ключи хоста без аутентификации на сервере SSH. Из его справочной страницы:
ssh-keyscan
утилита для сбора открытых ключей хоста ssh нескольких хостов Это было разработано, чтобы помочь в создании и проверкеssh_known_hosts
файлов.
Тип ключа, который нужно получить, указывается с помощью -t
параметра.
rsa1
(устаревшая версия протокола SSH 1)rsa
dsa
ecdsa
(последние версии OpenSSH)ed25519
(последние версии OpenSSH)В современных выпусках OpenSSH типами ключей по умолчанию для выборки являются rsa
(начиная с версии 5.1), ecdsa
(начиная с версии 6.0) и ed25519
(начиная с версии 6.7).
С более старыми версиями из ssh-keyscan
(до OpenSSH версии 5.1), то
по умолчанию тип ключ был устаревают rsa1
(SSH протокол 1) , так что основные типы должны быть явно указаны:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
печатает ключ хоста SSH-сервера в
формате Base64 . Чтобы преобразовать это в хэш отпечатка пальца, ssh-keygen
можно использовать утилиту с -l
возможностью печати отпечатка пальца указанного открытого ключа.
При использовании Bash, Zsh (или оболочки Korn), подстановка процесса может быть использована для удобной однострочной:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Примечание . В версиях OpenSSH до 7.2 функции, используемые
ssh-keygen
для чтения файлов, не очень хорошо обрабатывали именованные каналы (FIFO), поэтому этот метод не будет работать, что потребует использования временных файлов.
Последние версии ssh-keygen
печати SHA256 отпечатков пальцев хэши ключей. Чтобы получить MD5- хэши отпечатков ключей сервера (старое поведение), -E
можно использовать параметр, чтобы указать алгоритм хеширования:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Если используется оболочка POSIX (например, dash
), в которой не предусмотрена подстановка процессов, другие решения, использующие временные файлы, будут работать. Однако в более новых версиях OpenSSH (начиная с 7.2) можно использовать простой конвейер, поскольку он ssh-keygen
будет принимать -
имя файла для стандартного входного потока, что позволяет использовать однострочную команду конвейера.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygen
из более старых версий OpenSSH возникают проблемы с чтением из FIFO / именованного канала. Я посмотрю на это (и обновлю свой ответ), когда у меня будет немного свободного времени.
printf
в do_fingerprint()
функцию операторы отладки , я обнаружил, что в версиях OpenSSH до 7.2 функции, используемые ssh-keygen
для чтения файлов, не очень хорошо обрабатывали именованные каналы (FIFO), поэтому метод замены процесса не будет работать.
nmap
предоставляет эту возможность с помощью ssh-hostkey
сценария.
Чтобы вернуть шестнадцатеричный отпечаток ключа:
$ nmap [SERVER] --script ssh-hostkey
Чтобы вернуть содержимое ключа:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Чтобы вернуть визуальный пузырь ключа
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
Чтобы вернуть все вышеперечисленное:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Источник: nmap документы
-p
опция, которая может указывать порт, например -p 22000
. Также возможно использовать -vv
опцию для увеличения многословия (объем предоставленной информации)
filezilla отображает ключи, хэшированные с помощью md5, в шестнадцатеричном формате.
чтобы найти это на вашем компьютере с Ubuntu Linux, используйте эту команду:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
примечание: замените "localhost" на ip машины, которую вы хотите проверить.
Вот сценарий оболочки (в основном оболочка Bourne, но с использованием local
ключевого слова, которое доступно в большинстве современных /bin/sh
), я написал для этого. Используйте это как ssh-hostkey hostname
. Он покажет отпечатки пальцев в формате sha256 и md5 для всех ключей хоста для данного имени хоста или IP-адреса. Вы также можете вручную указать « md5
» или « sha256
» в качестве второго аргумента, чтобы показать только этот конкретный формат.
Он использует временный файл вместо конвейера, чтобы сделать его совместимым со старыми пакетами OpenSSH (как описано в других ответах). Временный файл использует /dev/shm
(разделяемую память), если доступно.
#!/bin/sh
usage () {
printf '%s\n' "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]"
}
ssh_hostkey () {
local host="$1"
local fprinthash="$2"
local tmp=
case "$host" in
-h|--help|'')
usage >&2
return 1
;;
esac
case "$fprinthash" in
md5|sha256|'') true;;
*)
usage >&2
printf '%s\n' "Fingerprint hash may be 'md5' or 'sha256'" >&2
return 2
;;
esac
if test -d /dev/shm
then tmp="$(mktemp -d -p /dev/shm)"
else tmp="$(mktemp -d)"
fi
trap 'trap - INT TERM EXIT; rm -rf "$tmp"' INT TERM EXIT
ssh-keyscan "$host" > "$tmp/f" 2> /dev/null
case "$fprinthash" in
sha256|'') ssh-keygen -l -f "$tmp/f" 2> /dev/null;;
esac
case "$fprinthash" in
md5|'') ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;;
esac
trap - INT TERM EXIT
rm -rf "$tmp" > /dev/null 2>&1
}
ssh_hostkey "$@"
ssh-keygen -l -f - <(ssh-keyscan host)
, правда?