जवाबों:
आप संयोजन से ऐसा कर सकता है 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 -
मुझे हाल ही में खुद ऐसा करना पड़ा था, इसलिए मैंने सोचा कि मैं एक उत्तर जोड़ूंगा जो दिखाता है कि यह कैसे किया जा सकता है ( ओपनएसएसएच 7.2 या नए संस्करण के साथ ) प्रक्रिया प्रतिस्थापन का उपयोग करके एक पंक्ति में:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
निम्न पाठ बताता है कि ये कमांड कैसे काम करते हैं और ओपनएसएसएच उपयोगिताओं के पुराने और नए संस्करणों के बीच व्यवहार के कुछ अंतरों को उजागर करते हैं।
ssh-keyscan
आदेश विकसित किया गया था, ताकि उपयोगकर्ताओं को SSH सर्वर से प्रमाणित करने की जरूरत के बिना सार्वजनिक मेजबान कुंजियों को प्राप्त कर सकते हैं। इसके मैन पेज से:
ssh-keyscan
कई मेजबानों की सार्वजनिक ssh होस्ट कीज़ को इकट्ठा करने की उपयोगिता है। इसेssh_known_hosts
फ़ाइलों के निर्माण और सत्यापन में सहायता के लिए डिज़ाइन किया गया था ।
कुंजी के प्रकार को -t
विकल्प का उपयोग करके निर्दिष्ट किया जाता है।
rsa1
(अप्रचलित SSH प्रोटोकॉल संस्करण 1)rsa
dsa
ecdsa
(ओपनएसएसएच के हाल के संस्करण)ed25519
(ओपनएसएसएच के हाल के संस्करण)आधुनिक 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
BaseH- एन्कोडेड
प्रारूप में SSH सर्वर की होस्ट कुंजी प्रिंट करता है । इसे फिंगरप्रिंट हैश में बदलने के लिए, ssh-keygen
उपयोगिता को इसके -l
विकल्प के साथ निर्दिष्ट सार्वजनिक कुंजी के फिंगरप्रिंट को प्रिंट करने के लिए इस्तेमाल किया जा सकता है ।
यदि बैश, जेडश (या कोर्न शेल) का उपयोग किया जाता है , तो प्रक्रिया प्रतिस्थापन का उपयोग एक आसान वन-लाइनर के लिए किया जा सकता है:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
नोट : 7.2% से पहले ओपनएसएसएच के संस्करणों के साथ, ssh-keygen
फ़ाइलों को पढ़ने के लिए उपयोग किए जाने वाले फ़ंक्शन
, पाइप नाम (FIFOs) को बहुत अच्छी तरह से संभाल नहीं करते थे, इसलिए यह विधि काम नहीं करेगी, इस प्रकार अस्थायी फ़ाइलों के उपयोग की आवश्यकता होती है।
हाल ही में SHA256 फ़िंगरप्रिंट हैश की चाबियों के ssh-keygen
प्रिंट संस्करण । सर्वर कुंजी फिंगरप्रिंट (पुराने व्यवहार) के एमडी 5 हैश पाने के
लिए, हैश एल्गोरिथ्म को निर्दिष्ट करने के लिए विकल्प का उपयोग किया जा सकता है:-E
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
यदि POSIX शेल (जैसे कि dash
) का उपयोग किया जाए, जिसमें प्रक्रिया प्रतिस्थापन की सुविधा नहीं है, तो अस्थायी फ़ाइलों का उपयोग करने वाले अन्य समाधान काम करेंगे। हालांकि, ओपनएसएसएच (7.2 के बाद से) के नए संस्करणों के साथ, एक सरल पाइपलाइन का उपयोग किया जा सकता है क्योंकि मानक इनपुट स्ट्रीम के लिए एक फ़ाइल नाम के रूप में ssh-keygen
स्वीकार करेगा -
, एक लाइन पाइपलाइन कमांड की अनुमति देता है।
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygen
ओपनएसएसएच के पुराने संस्करणों से एफआईएफओ / नामित पाइप से पढ़ने में समस्या है। जब मुझे कुछ खाली समय मिलेगा, तो मैं इस पर ध्यान दूंगा (और अपने उत्तर को अपडेट करूंगा)।
printf
में डिबगिंग स्टेटमेंट डालने के बाद do_fingerprint()
, मैंने पाया कि ओपनएसएसएच के संस्करणों के साथ 7.2 से पहले, ssh-keygen
फ़ाइलों को पढ़ने के लिए उपयोग किए जाने वाले फ़ंक्शंस , नामित पाइप (एफआईएफओ) को बहुत अच्छी तरह से नहीं संभालते थे प्रक्रिया प्रतिस्थापन विधि काम नहीं करेगी।
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
स्रोत: नैम्प डॉक्स
-p
विकल्प है जो एक पोर्ट निर्दिष्ट कर सकता है, उदा -p 22000
। -vv
वर्बोसिटी (दी गई जानकारी की मात्रा) को बढ़ाने के लिए विकल्प का उपयोग करना भी संभव है
यहां एक शेल स्क्रिप्ट है (मुख्य रूप से बॉर्न शेल लेकिन local
कीवर्ड का उपयोग करके , जो कि सबसे आधुनिक में उपलब्ध है /bin/sh
) मैंने ऐसा करने के लिए लिखा है। इसका उपयोग करें ssh-hostkey hostname
। यह दिए गए होस्टनाम या आईपी पते के लिए सभी hostkeys के लिए sha256 और md5 प्रारूप फ़िंगरप्रिंट दोनों दिखाएगा। आप विशेष रूप से केवल उस विशेष प्रारूप को दिखाने के लिए दूसरे तर्क के रूप में " md5
" या " sha256
" मैन्युअल रूप से निर्दिष्ट कर सकते हैं ।
यह पुराने ओपनएसएसएच पैकेज (जैसा कि अन्य उत्तरों में वर्णित है) के साथ संगत बनाने के लिए पाइपिंग के बजाय एक अस्थायी फ़ाइल का उपयोग करता है। अस्थायी फ़ाइल /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)
करता है, हालांकि?