Yanıtlar:
Bunu ssh-keyscanve ssh-keygenaş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-keyscanKullanıcıların SSH sunucusuna kimlik gerek kalmadan kamu konak anahtarlarını elde edebileceği şekilde komut geliştirildi. Man sayfasından:
ssh-keyscanbir dizi ana bilgisayarın genel ssh ana bilgisayar anahtarlarını toplamak için bir yardımcı programdır.ssh_known_hostsDosyaların oluşturulmasına ve doğrulanmasına yardımcı olmak için tasarlanmıştır .
Alınacak anahtarın türü, -tseçenek kullanılarak belirlenir .
rsa1 (eski SSH Protokolü sürüm 1)rsadsaecdsa (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 rsa1açıkça belirtilmiş olması gerekir (SSH Protokolü 1) böylece anahtar türleri:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscanSSH sunucusunun ana bilgisayar anahtarını Base64 kodlu
biçimde basar . Bunu bir parmak izi karmağına dönüştürmek için, ssh-keygenyardımcı program -lbelirtilen 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-keygendosyaları 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-keygenyazdı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-keygenkabul edeceğinden basit bir boru hattı kullanılabilir -.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygenOpenSSH eski sürümlerine FIFO / adlı kanal okunurken bir sorun var. Biraz boş zamanlarımda buna bakacağım (ve cevabımı güncelleyeceğim).
printfifadelerini do_fingerprint()fonksiyona ekleyerek harcadıktan sonra , OpenSSH'nin 7.2'den önceki sürümlerinde, ssh-keygendosyaları 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.
nmapssh-hostkeybetiğ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 localen 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/shmvarsa (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?