.Ssh / अधिकृत_keys (2) ফাইলের জন্য সমস্ত ফিঙ্গারপ্রিন্ট কীভাবে পাবেন


39

.Ssh / अधिकृत_keys- এ প্রবেশ করা সমস্ত ফিঙ্গারপ্রিন্টের একটি তালিকা পাওয়ার কি কোনও সহজ উপায় আছে? .ssh / अधिकृत_keys2 ফাইল?

ssh-keygen -l -f .ssh/authorized_keys 

কেবল প্রথম লাইন / প্রবেশ / পাবলিকির ফিঙ্গারপ্রিন্ট ফিরিয়ে দেবে

অবাক সঙ্গে হ্যাক:

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"
        )
    }
}'

তবে এর চেয়ে সহজ উপায় বা এসএসএস কমান্ড আমি খুঁজে পাই না?


নির্ভরযোগ্যভাবে এটি করতে আপনাকে authorized_keysফাইলের বিকল্প ক্ষেত্রটি বিবেচনা করতে হবে, যা ssh-keygenবাউলস। আমি এটি বিশ্লেষণের জন্য একটি নির্ভরযোগ্য উপায়ের সন্ধান করেছি তবে আমি যে উত্তম সাথে আসতে পেরেছি তা এই উত্তরটি দিয়ে আচ্ছাদিত ।
স্টারফাই

উত্তর:


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
সুন্দর @ রাফিংক, আপনাকে ধন্যবাদ যুক্ত কোড . childno.de/marcel/changeset/afdce0dd ;) একটি দ্রষ্টব্য: ssh-keygen -l -f /dev/stdinম্যাকের উপর কাজ করছে না বলে মনে হচ্ছে .. তবুও সার্ভারের জন্য প্রাসঙ্গিক নয় তবে gnaa আপেল নাকি এটি BSD "সমস্যা" পাচ্ছে /dev/stdin is not a public key file.?!
childno͡.de

1
পড়া পড়া /dev/stdinসাধারণভাবে দুর্দান্ত ধারণা নয়, এটি ব্যবহার করা ভাল -, তবে কোনও কারণে ssh-keygenসম্পর্কে জানেন না -...
hফিংক

ম্যাক কাজ করে না?
উইল

1
কীগুলি বিকল্পগুলির সাথে উপসর্গ করা থাকলে এটি কাজ করে না।
স্টারফ্রি

1
@ Hফিংক: আমি 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
কোনটি এটি নিরাপদ করে তোলে, তাই না? আপনি সম্পাদনা করতে স্বাগত জানাই তবে কেন ডাউনটা? আমি প্রস্তাব দিইনি যে এটি আপনার চেয়ে ভাল কোনও ধরণের সমাধান ছিল ... আমি মনে করি একটি সুরক্ষিত টেম্পাইলটি আরও ভাল এবং স্ক্রিপ্টিংয়ের জন্য আরও সুরক্ষার প্রয়োজন। এছাড়াও, উপরের সংস্করণটি নোক্লোবার-নিরাপদ।
Will

একটি ফ্রিবিএসডি সিস্টেমের জন্য (যা ডিফল্টরূপে ব্যাশ ব্যবহার করে না), আমি নিম্নলিখিত পরিবর্তনগুলি করেছি: ধরে নিচ্ছি পোর্টগুলি থেকে ব্যাশ ইনস্টল করা আছে, প্রথম লাইনটি এতে পরিবর্তন করুন #!/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

Hফিংকের উত্তর এবং ম্যান xargs from উদাহরণ থেকে / ডিভ / স্টিডিন ট্রিকের উপর ভিত্তি করে একটি ওয়ান-লাইনার → উদাহরণ :

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

এটি দুর্দান্ত কাজ করে এবং এটি যদি ওয়ান-লাইনার দেয় তবে সহজেই এসএসএইচ দিয়ে কমান্ডটি চালাতে ব্যবহার করা যেতে পারে। ধন্যবাদ!
থাইবাট ব্যারারে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.