~ / .Ssh / अधिकृत_की प्रारूप में कुंजियों को देखते हुए, क्या आप आसानी से मुख्य शक्ति निर्धारित कर सकते हैं?


17

~ /। ssh / अधिकृत_की [2] में सार्वजनिक कुंजी की सूची है।

दुर्भाग्य से, प्रत्येक सार्वजनिक कुंजी में मुख्य शक्ति (बिट्स की संख्या) निर्दिष्ट नहीं होती है।

क्या कोई उपयोगिता है जो इस फ़ाइल लाइन को लाइन से संसाधित कर सकती है और मुख्य शक्ति को आउटपुट कर सकती है?

मैंने इसके लिए मैन पेज चेक किए ssh-keygen, लेकिन ऐसा लगता है कि यह केवल निजी कुंजी के साथ काम करेगा।

इसके अलावा, क्या ऐसा कोई उपकरण है जो शट हैश को उसी तरह से आउटपुट करेगा जैसे वह pageantपुट्टी टूल में प्रदर्शित होता है ?

जिस प्रारूप की मुझे तलाश है:

Key Algorithm  Strength  Hash                                             Comment
ssh-rsa        2048      00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff  user1@host1
ssh-rsa        2048      11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:11  user2@host2

2
ध्यान दें, कि ओपनश-7.2 के लिए, आपको अब स्वीकृत उत्तर में जादू करने की आवश्यकता नहीं है और आप ssh-keygenपूरी फाइल के साथ फीड कर सकते हैं । नीचे मेरा जवाब देखें
12

जवाबों:


17

ssh-keygen कार्य का मूल कार्य कर सकता है (सार्वजनिक कुंजी से फ़िंगरप्रिंट उत्पन्न करना), लेकिन यह स्वचालित रूप से कई कुंजियों की सूची संसाधित नहीं करेगा जैसा कि आमतौर पर किसी authorized_keysफ़ाइल में पाया जाता है।

यहाँ एक स्क्रिप्ट है जो कुंजियों को विभाजित करती है, उन्हें ssh-keygen को खिलाती है और वह टेबल तैयार करती है जिसे आप चाहते हैं:

#!/bin/sh

# usage: authkeys-report <authorized_keys-file>    

set -ue

tmp="$(mktemp -t fingerprint-authkeys.XXXXXXXX)"
trap 'rm -f "$tmp"' 0

while read opts key; do
    case "$opts" in
        [0-9]*|ssh-dss|ssh-rsa)
            # not options, first "word" is part of key
            key="$opts $key"
        ;;
    esac
    echo "$key" >$tmp
    set -- $(ssh-keygen -lf "$tmp")
    bits="$1" fingerprint="$2"

    set -- $key # Note: will mangle whitespace in the comment
    case "$1" in
        [0-9]*) # SSH v1 key
            type=rsa1
            shift 3
        ;;
        ssh-rsa|ssh-dss) # SSH v2 key
            type="$1"
            shift 2
        ;;
        *)
            type=unknown
            set --
        ;;
    esac

    printf '%-14s %-9s %s %s\n' "$type" "$bits" "$fingerprint" "$*"
done <$1

tmp="$(mktemp -t fingerprint-authkeys)"बदल दिया जाना चाहिएtmp="$(mktemp -t fingerprint-authkeys.XXX)"
स्टीफन

1
@Stefan: mktemp(1)Xs की जरूरत के सभी संस्करण नहीं : फ्रीबीएसडी , मैक ओएस एक्स । लेकिन, उन्हें जोड़ने से उन लोगों के व्यवहार को नुकसान नहीं होगा, जिनकी उन्हें आवश्यकता नहीं है (वे यादृच्छिक प्रत्यय से पहले एक्स के साथ समाप्त होते हैं)।
क्रिस जॉन्सन

ओह .. :) मस्त ... मैंने अपने आर्च बॉक्स पर स्क्रिप्ट चलाने की कोशिश की ... कहता रहा/home/steve/.scripts/key-strength: line 36: $1: unbound variable
स्टीफन

धन्यवाद, -lविकल्प वास्तव में मैं क्या देख रहा था! फिर भी यह अविश्वसनीय है कि आप ssh-keygen के लिए कुछ भी पाइप नहीं कर सकते हैं और MUSTडिस्क पर फ़ाइल रख सकते हैं।
अलेक्जेंडर पोगरेबनेक

1
ध्यान दें, कि ओपनशिश-7.2 के लिए, आपको इस जादू को करने की आवश्यकता नहीं है और आप ssh-keygenपूरी फाइल के साथ फीड कर सकते हैं । नीचे मेरा जवाब देखें
जकूजी

10

ssh-keygenin opensh-7.2 (वर्तमान में फेडोरा और उबंटू में कम से कम) एक ही फाइल से कई कुंजियों को पढ़ने का समर्थन करता है। इसलिए बस चल रहा है

# ssh-keygen -l -f ~/.ssh/authorized_keys
2048 SHA256:xh0IVbI... jakuje@jakuje (RSA)
2048 SHA256:xh0IVbI... jakuje@jakuje (RSA)

वांछित उत्पादन में परिणाम।


1
अच्छा है कि उन्होंने आखिरकार कमी को ठीक कर लिया है। +1
अलेक्जेंडर पोगरेबनीक

7

यदि आपके पास zsh है, तो आप इसे वन-लाइनर के रूप में कर सकते हैं:

while read line ; do ssh-keygen -lf =(echo $line); done < .ssh/authorized_keys

4

जश समाधान से एक्सट्रपलेटिंग एक बैश समाधान

while read line ; do ssh-keygen -l -f <(echo $line); done < .ssh/authorized_keys 

/ dev / fd / 63 एक सार्वजनिक कुंजी फ़ाइल नहीं है।
/ dev / fd / 63 एक सार्वजनिक कुंजी फ़ाइल नहीं है।

लगभग ... यह काम करना चाहिए, लेकिन ssh-keygen उत्पन्न एफडी से सीधे पढ़ना पसंद नहीं करता है। <के लिए एक अस्थायी फ़ाइल का उपयोग करना (पुनर्निर्देशन, यह तब काम करता है। क्यों?

while read line
do
  cat > /tmp/key <(echo $line)
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 

1024 1f: c7: da: ef: ff: ff: ff: f8: c8: 77: c6: f8: 1f: dd: f3: 1a / tmp / key (RSA)
303 83: सीडी: एफएफ: बी 4: एफएफ: ff: ff: ff: 02: 30: e7: 1e: 47: ed: c5: 69 / tmp / key (RSA)

बेशक तब आप इसे आसानी से लिख सकते हैं और खुश रह सकते हैं

while read line
do
  echo $line > /tmp/key
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 
rm /tmp/key

शायद ssh-keygen का नया संस्करण एक विशेष फ़ाइल से पढ़ने को संभाल सकता है, क्योंकि आपका वन-लाइनर मेरे लिए पूरी तरह से काम करता है।
ब्रायन मिंटन

कुछ संस्करण जैसे कि स्टड से पढ़ना, दूसरों को मना कर देता है। एक सामान्य फ़ाइल के माध्यम से जाना हर जगह काम करता है।
मार्सिन

3

authorized_keysसरवाना द्वारा बनाई गई फ़ाइल से सभी फिंगर प्रिंट को सूचीबद्ध करने के लिए स्क्रिप्ट :

#!/usr/bin/ksh

USER=`whoami`
USER_H=` lsuser -a home $USER |awk -F '=' '{print $2}'`

cat $USER_H/.ssh/authorized_keys| while read line
do
  echo $line > /tmp/finger_print
  echo "************* Key,finger print details below ***************************"

  cat /tmp/finger_print
  echo

  ssh-keygen -l -f /tmp/finger_print|grep -v not|awk '{print $1" " $2 " " $4}'
  if ssh-keygen -l -f /tmp/finger_print|grep "is not a" > /dev/null 2>&1
  then
    echo "The above key is an Invalid Key,Please correct it"
  fi

  echo "========================================================================"

  rm /tmp/finger_print
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.