Yanıtlar:
Bunu ssh-keyscan
ve ssh-keygen
aşağıdakileri birleştirerek yapabilirsiniz :
$ 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
(ne yazık ki çok daha basit ssh-keyscan host | ssh-keygen -l -f /dev/stdin
çalışmıyor)
ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
ssh-keygen 7.2 ve üzeri sürümlerde beklendiği gibi çalışır. Anthony Geoghegan ya dassh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Son zamanlarda bunu kendim yapmak zorunda kaldım, bu yüzden proses ikameini kullanarak bir satırda bunun ( OpenSSH 7.2 veya daha yeni sürümlerle) nasıl yapılabileceğini gösteren bir cevap ekleyeceğimi düşündüm :
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Aşağıdaki metin, bu komutların nasıl çalıştığını açıklar ve OpenSSH yardımcı programlarının eski ve daha yeni sürümleri arasındaki davranış farklarından bazılarını vurgular.
ssh-keyscan
Kullanıcıların SSH sunucusuna kimlik gerek kalmadan kamu konak anahtarlarını elde edebileceği şekilde komut geliştirildi. Man sayfasından:
ssh-keyscan
bir dizi ana bilgisayarın genel ssh ana bilgisayar anahtarlarını toplamak için bir yardımcı programdır.ssh_known_hosts
Dosyaların oluşturulmasına ve doğrulanmasına yardımcı olmak için tasarlanmıştır .
Alınacak anahtarın türü, -t
seçenek kullanılarak belirlenir .
rsa1
(eski SSH Protokolü sürüm 1)rsa
dsa
ecdsa
(OpenSSH'nin son sürümleri)ed25519
(OpenSSH'nin son sürümleri)Modern OpenSSH sürümlerinde alınacak varsayılan anahtar türleri rsa
(sürüm 5.1'den beri), ecdsa
(sürüm 6.0'dan beri) ve ed25519
(sürüm 6.7'den beri).
İle eski sürümleri arasında ssh-keyscan
(OpenSSH sürümü 5.1 öncesi),
varsayılan anahtar türü demode olduğunu rsa1
açıkça belirtilmiş olması gerekir (SSH Protokolü 1) böylece anahtar türleri:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
SSH sunucusunun ana bilgisayar anahtarını Base64 kodlu
biçimde basar . Bunu bir parmak izi karmağına dönüştürmek için, ssh-keygen
yardımcı program -l
belirtilen ortak anahtarın parmak izini yazdırma seçeneği ile birlikte kullanılabilir .
Bash, Zsh (veya Korn kabuğu) kullanıyorsanız, işlem ikame kullanışlı bir tek astar için kullanılabilir:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Not : 7.2'den önceki OpenSSH sürümlerinde, ssh-keygen
dosyaları okumak için kullanılan işlevler
, adlandırılmış yöneltmeler (FIFO'lar) çok iyi işleyemedi, bu nedenle bu yöntem işe yaramazdı, bu nedenle geçici dosyaların kullanılmasını gerektiriyordu.
Anahtarların son SHA256 parmak izi karelerini ssh-keygen
yazdırma sürümleri . Sunucu anahtarı parmak izlerinin (eski davranış) MD5 karmasını elde etmek için ,
seçenek karma algoritmasını belirtmek için kullanılabilir:-E
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
dash
İşlem değiştirme özelliğine sahip olmayan bir POSIX kabuğu (örneğin ) kullanıyorsanız, geçici dosyaları kullanan diğer çözümler işe yarayacaktır. Bununla birlikte, OpenSSH'nin daha yeni sürümleriyle (7.2'den beri), tek satırlık bir boru hattı komutuna izin veren standart giriş akışı için bir dosya adı olarak ssh-keygen
kabul edeceğinden basit bir boru hattı kullanılabilir -
.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygen
OpenSSH eski sürümlerine FIFO / adlı kanal okunurken bir sorun var. Biraz boş zamanlarımda buna bakacağım (ve cevabımı güncelleyeceğim).
printf
ifadelerini do_fingerprint()
fonksiyona ekleyerek harcadıktan sonra , OpenSSH'nin 7.2'den önceki sürümlerinde, ssh-keygen
dosyaları okumak için kullanılan işlevlerin , adlandırılmış yöneltmeler (FIFO'lar) çok iyi işleyemediğini öğrendim. işlem değiştirme yöntemi işe yaramaz.
nmap
ssh-hostkey
betiği kullanarak bu yeteneği sağlar .
Anahtarın onaltılık parmak izini döndürmek için:
$ nmap [SERVER] --script ssh-hostkey
Anahtarın içeriğini döndürmek için:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Anahtarın görsel balonunu geri göndermek için
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
Yukarıdakilerin tümünü iade etmek için:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Kaynak: nmap docs
-p
örneğin bir bağlantı noktası belirtebilirsiniz seçeneği -p 22000
. -vv
İşte bir kabuk betiği (çoğunlukla Bourne kabuğu, ancak local
en modern şekilde kullanılabilen anahtar sözcüğü kullanarak /bin/sh
) bunu yapmak için yazdım. Gibi kullanın ssh-hostkey hostname
. Verilen ana bilgisayar adı veya IP adresi için tüm ana bilgisayar anahtarları için sha256 ve md5 biçiminde parmak izlerini gösterir. Ayrıca , yalnızca " md5
" veya " sha256
" ifadesini, yalnızca bu belirli formatı gösterecek ikinci argüman olarak da belirleyebilirsiniz.
Eski OpenSSH paketleriyle uyumlu hale getirmek için boru yerine geçici bir dosya kullanır (diğer cevaplarda açıklandığı gibi). Geçici dosya /dev/shm
varsa (paylaşılan hafıza) kullanır .
#!/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)
öyle mi?