Odpowiedzi:
Możesz to zrobić, łącząc ssh-keyscan
i 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
(niestety znacznie prostsze ssh-keyscan host | ssh-keygen -l -f /dev/stdin
nie działa)
ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
działa zgodnie z oczekiwaniami w ssh-keygen 7.2 i nowszych. Tworzy kilka wierszy komentarza do STDERR, które można odfiltrować, jak wspomniano w odpowiedzi Anthony Geoghegan lubssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Niedawno musiałem to zrobić sam, więc pomyślałem, że dodam odpowiedź, która pokazuje, jak można to zrobić (z wersjami OpenSSH 7.2 lub nowszą ) w jednym wierszu za pomocą podstawiania procesów:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Poniższy tekst wyjaśnia, jak działają te polecenia, i podkreśla niektóre różnice w zachowaniu między starszymi i nowszymi wersjami narzędzi OpenSSH.
ssh-keyscan
Komenda została opracowana tak, że użytkownicy mogą uzyskać klucze hostów publicznych bez konieczności uwierzytelnienia na serwerze SSH. Ze strony podręcznika:
ssh-keyscan
to narzędzie do gromadzenia publicznych kluczy hosta ssh wielu hostów. Został zaprojektowany, aby pomóc w budowaniu i weryfikacjissh_known_hosts
plików.
Typ klucza do pobrania jest określany za pomocą -t
opcji.
rsa1
(przestarzała wersja protokołu SSH 1)rsa
dsa
ecdsa
(ostatnie wersje OpenSSH)ed25519
(ostatnie wersje OpenSSH)We współczesnych wersjach OpenSSH domyślnymi typami kluczy do pobrania są rsa
(od wersji 5.1), ecdsa
(od wersji 6.0) i ed25519
(od wersji 6.7).
Ze starszymi wersjami w ssh-keyscan
(przed) OpenSSH wersji 5.1 The
domyślny typ klucz był przestarzały rsa1
(SSH Protokół 1) główne typy tak musiałby być wyraźnie określone:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
wypisuje klucz hosta serwera SSH w
formacie zakodowanym w Base64 . Aby przekonwertować to na skrót linii papilarnych, ssh-keygen
można użyć narzędzia z jego -l
opcją drukowania odcisku palca określonego klucza publicznego.
Jeśli używasz Bash, Zsh (lub powłoki Korna), możesz zastosować podstawienie procesu dla poręcznej jednowarstwowej:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Uwaga : W wersjach OpenSSH wcześniejszych niż 7.2 funkcje używane przez
ssh-keygen
do odczytu plików nie radziły sobie bardzo dobrze z nazwanymi potokami (FIFO), więc ta metoda nie działała, co wymagało użycia plików tymczasowych.
Najnowsze wersje ssh-keygen
print SHA256 mieszań papilarnych kluczy. Aby uzyskać skróty MD5 odcisków palców klucza serwera (stare zachowanie), -E
można użyć opcji określającej algorytm skrótu:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Jeśli używasz powłoki POSIX (takiej jak dash
), która nie obsługuje zastępowania procesów, inne rozwiązania wykorzystujące pliki tymczasowe będą działać. Jednak w nowszych wersjach OpenSSH (od wersji 7.2) można użyć prostego potoku, ponieważ ssh-keygen
będzie on akceptowany -
jako nazwa pliku dla standardowego strumienia wejściowego, umożliwiając jednoliniowe polecenie potoku.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygen
ze starszych wersji OpenSSH występuje problem z odczytem z FIFO / nazwanego potoku. Zajmę się tym (i zaktualizuję swoją odpowiedź), kiedy będę miał trochę wolnego czasu.
printf
instrukcji debugowania do do_fingerprint()
funkcji zauważyłem, że w wersjach OpenSSH wcześniejszych niż 7.2 funkcje używane ssh-keygen
do odczytu plików nie radziły sobie bardzo dobrze z nazwanymi potokami (FIFO), więc metoda podstawienia procesu nie zadziałałaby.
nmap
zapewnia tę możliwość za pomocą ssh-hostkey
skryptu.
Aby zwrócić szesnastkowy odcisk klucza:
$ nmap [SERVER] --script ssh-hostkey
Aby zwrócić zawartość klucza:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Aby zwrócić bańkę wizualną klucza
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
Aby zwrócić wszystkie powyższe:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Źródło: dokumenty nmap
-p
opcję określającą port, np -p 22000
. Możliwe jest również użycie -vv
opcji zwiększenia gadatliwości (ilość podanych informacji)
filezilla wyświetla klucze zakodowane przy pomocy md5 w formacie szesnastkowym .
aby znaleźć to na swoim komputerze z systemem Linux Ubuntu , użyj tego polecenia:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
Uwaga: zamień „localhost” na ip komputera, który chcesz sprawdzić.
Oto skrypt powłoki (głównie powłoka Bourne'a, ale za pomocą local
słowa kluczowego, które jest dostępne w najnowocześniejszych /bin/sh
), które napisałem, aby to zrobić. Użyj tego jak ssh-hostkey hostname
. Wyświetli odciski palców w formacie sha256 i md5 dla wszystkich kluczy hostów dla podanej nazwy hosta lub adresu IP. Możesz także ręcznie określić „ md5
” lub „ sha256
” jako drugi argument, aby pokazać tylko ten konkretny format.
Używa pliku tymczasowego zamiast potokowania, aby był zgodny ze starszymi pakietami OpenSSH (jak opisano w innych odpowiedziach). Plik tymczasowy wykorzystuje /dev/shm
(pamięć współdzieloną), jeśli jest dostępna.
#!/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)
jednak?