.Ssh / अधिकृत_की (2) फ़ाइल के लिए सभी फ़िंगरप्रिंट कैसे प्राप्त करें


39

क्या .ssh / अधिकृत_की में प्रवेश की गई सभी उंगलियों के निशान की सूची प्राप्त करने का एक सरल तरीका है || .Ssh / अधिकृत_की 2 फ़ाइल?

ssh-keygen -l -f .ssh/authorized_keys 

केवल पहली पंक्ति / प्रविष्टि / publickey का फिंगरप्रिंट लौटाएगा

जाग के साथ हैक:

awk 'BEGIN { 
    while (getline < ".ssh/authorized_keys") {
        if ($1!~"ssh-(r|d)sa") {continue}
        print "Fingerprint for "$3
        system("echo " "\""$0"\"> /tmp/authorizedPublicKey.scan; \
            ssh-keygen -l -f /tmp/authorizedPublicKey.scan; \
            rm /tmp/authorizedPublicKey.scan"
        )
    }
}'

लेकिन वहाँ एक आसान तरीका है या ssh कमांड मुझे नहीं मिला?


मज़बूती से ऐसा करने के लिए आपको authorized_keysफ़ाइल में विकल्प फ़ील्ड पर विचार करना होगा , जिस पर ssh-keygenबॉल्स हैं। मैंने इसे पार्स करने के लिए एक विश्वसनीय तरीके की तलाश की, लेकिन सबसे अच्छा मैं इस उत्तर को कवर कर सकता हूं ।
स्टारफ्री 8

जवाबों:


45

यहां अस्थायी फ़ाइलों के बिना सादे बैश का उपयोग करके एक और हैक किया गया है:

while read l; do
  [[ -n $l && ${l###} = $l ]] && ssh-keygen -l -f /dev/stdin <<<$l;
done < .ssh/authorized_keys

आप इसे आसानी से अपने में एक फंक्शन बना सकते हैं .bashrc:

function fingerprints() {
  local file="${1:-$HOME/.ssh/authorized_keys}"
  while read l; do
    [[ -n $l && ${l###} = $l ]] && ssh-keygen -l -f /dev/stdin <<<$l
  done < "${file}"
}

और इसके साथ कॉल करें:

$ fingerprints .ssh/authorized_keys

1
अच्छा @ रफिंक, धन्यवाद। जोड़ा code.childno.de/marcel/changeset/afdce0dd ;) एक ध्यान दें: ssh-keygen -l -f /dev/stdinनहीं काम करने के लिए पर एक मैक .. फिर भी नहीं सर्वर लेकिन के लिए प्रासंगिक लगती है gnaa सेब या यह एक बीएसडी "समस्या" है हो रही है /dev/stdin is not a public key file.?!
चाइल्डनो childड

1
से पढ़ रहा है /dev/stdin, सामान्य रूप में एक बहुत अच्छा विचार नहीं है, यह उपयोग करने के लिए बेहतर है -, लेकिन के लिए किसी कारण ssh-keygenपता नहीं है के बारे में -...
ℝaphink

मैक पर काम नहीं करता है?
विल

1
यदि कुंजियाँ विकल्पों के साथ उपसर्ग करती हैं तो यह काम नहीं करता है।
स्टार

1
@ Itफिंक: मैं local file="${1:-$HOME/.ssh/authorized_keys}"इसके लिए बिना किसी तर्क और सामान्य ~/.ssh/authorized_keysफ़ाइल के लिए डिफ़ॉल्ट रूप से काम करने की अनुमति देता हूं और लूप के < "$file"इनपुट के रूप में उपयोग किया जाता है while
0xC0000022L

8

मैक और लिनक्स पर परीक्षण किए गए फ़ाइल के लिए सभी प्रमुख उंगलियों के निशान दिखाने का एक पोर्टेबल तरीका है:

#!/bin/bash

fingerprint_keys()
{
    if (( $# != 1 )); then
        echo "Usage: ${FUNCNAME} <authorized keys file>" >&2
        return 1
    fi

    local file="$1"
    if [ ! -r "$file" ]; then
        echo "${FUNCNAME}: File '${file}' does not exist or isn't readable." >&2
        return 1
    fi

    # Must be declared /before/ assignment, because of bash weirdness, in
    # order to get exit code in $?.
    local TMPFILE

    TEMPFILE=$(mktemp -q -t "$0.XXXXXXXXXX")
    if (( $? != 0 )); then
        echo "${FUNCNAME}: Can't create temporary file." >&2
        return 1
    fi

    while read line; do
        # Make sure lone isn't a comment or blank.
        if [[ -n "$line" ]] && [ "${line###}" == "$line" ]; then
            # Insert key into temporary file (ignoring noclobber).
            echo "$line" >| "$TEMPFILE"

            # Fingerprint time.
            ssh-keygen -l -f "$TEMPFILE"

            # OVerwrite the file ASAP (ignoring noclobber) to not leave keys
            # sitting in temp files.
            >| "$TEMPFILE"
        fi
    done < "$file"

    rm -f "$TEMPFILE"
    if (( $? != 0 )); then
        echo "${FUNCNAME}: Failed to remove temporary file." >&2
        return 1
    fi
}

उदाहरण उपयोग:

bash $ fingerprint_keys ~/.ssh/authorized_keys
2048 xx:xx:xx:xx:xx:xx:xx:xx:bb:xx:xx:xx:xx:xx:xx:xx  x@x.local (RSA)
bash $ 

यह कहने के लिए क्षमा करें, लेकिन यह न तो "सरल" है, और न ही "छोटा" भी "चालाक" नहीं है और ऊपर सूचीबद्ध की तुलना में दूसरा दृष्टिकोण नहीं लेता है। अधिक त्रुटि हैंडलर का उपयोग करके सिर्फ एक स्क्रिप्ट;)
चाइल्डनो.ड

3
जो इसे सुरक्षित बनाता है, है ना? आप संपादन करने के लिए स्वागत कर रहे हैं, लेकिन नीचे क्यों? मैंने यह प्रस्ताव नहीं किया कि यह आपकी तुलना में किसी भी तरह का बेहतर समाधान था ... मुझे लगता है कि एक सुरक्षित अस्थायी बेहतर है, और स्क्रिप्टिंग उद्देश्यों के लिए अधिक सुरक्षा की आवश्यकता है। इसके अलावा, ऊपर दिया गया संस्करण noclobber-safe है।
विल

एक FreeBSD सिस्टम के लिए (जो डिफ़ॉल्ट रूप से bash का उपयोग नहीं करता है), मैंने निम्नलिखित बदलाव किए: मान लिया गया कि पोर्ट से bash स्थापित है, पहली पंक्ति को बदल दें #!/usr/local/bin/bash। मैंने इसे अंतिम पंक्ति के रूप में जोड़कर फ़ंक्शन को बुलाया fingerprint_keys $@:। मैंने स्क्रिप्ट को सहेजा fingerprints.bash, इसे निष्पादन योग्य के रूप में चिह्नित किया chmod u+x ./fingerprints.bash। इसके अतिरिक्त, मैंने इस उत्तर के लिंक के साथ फ़ाइल में एक टिप्पणी जोड़ी, जैसे कि, शीर्ष के पास # solution from "Will" on SO http://serverfault.com/a/615892/126742। ऐसे ही बुला लो ./fingerprints.bash ~/.ssh/authorized_keys
derekv

1
@ डेरेकव: अधिक पोर्टेबल विधि निम्नलिखित हैशबैंग का उपयोग करना है: #!/usr/bin/env bashक्योंकि इसके लिए पथ envबहुत पोर्टेबल है और यह envउस बैश को निष्पादित करने के लिए कहता है जिसके बारे में वह जानता है।
0xC0000022L

7

'Saphink के उत्तर और आदमी xargs से / देव / स्टडिन चाल पर आधारित एक-लाइनर → EXAMPLES :

egrep '^[^#]' ~/.ssh/authorized_keys | xargs -n1 -I% bash -c 'ssh-keygen -l -f /dev/stdin <<<"%"'

यह बहुत अच्छा काम करता है, और यह एक-लाइनर है, इसे आसानी से SSH के माध्यम से कमांड चलाने के लिए इस्तेमाल किया जा सकता है। धन्यवाद!
थिबुत बर्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.