Tüm parmak izi nasıl .ssh / yetkili_keys (2) dosyası için


39

Girilen tüm parmak izlerinin listesini almanın basit bir yolu var mı. .ssh / yetkili_keys2 dosyası?

ssh-keygen -l -f .ssh/authorized_keys 

sadece ilk satırın / girişin / yayıncının parmak izini döndürür

awk ile kesmek:

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

ama bulamadığım daha kolay bir yol ya da ssh komutu var mı?


Bunu güvenilir bir şekilde yapmak için authorized_keys, ssh-keygenbaulks olan dosyadaki seçenekler alanını göz önünde bulundurmalısınız . Ayrıştırmak için güvenilir bir yol aradım, ancak bulabildiğim en iyi şey bu cevabı kapsıyor .
starfry

Yanıtlar:


45

İşte geçici dosyaları olmayan düz bash kullanarak başka bir kesmek:

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

Kolayca sizin bir işlevi yapabilirsiniz .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}"
}

ve ile ara:

$ fingerprints .ssh/authorized_keys

1
nice @Raphink, teşekkür ederim. eklendi code.childno.de/marcel/changeset/afdce0dd ;) Bir Not: ssh-keygen -l -f /dev/stdinyine de bir mac .. üzerinde çalışmaya sunucular ancak ilgili olmayan görünüyor gnaa elma ya da bir BSD "sorunu" olduğunu alıyorum /dev/stdin is not a public key file.?!
childno͡.de

1
Okuma /dev/stdindaha iyi kullanımına değil, genel olarak harika bir fikir değil -, ancak bazı nedenle ssh-keygenbilmiyor yaklaşık -...
ℝaphink

Mac'te çalışmıyor mu?
Will

1
Tuşlar seçeneklerle ön eklenmişse bu çalışmaz.
starfry

1
@ Düğüm: local file="${1:-$HOME/.ssh/authorized_keys}"Herhangi bir argüman olmadan çalışmasına izin verir ve her zamanki ~/.ssh/authorized_keysdosyaya varsayılandır ve < "$file"kullanılan whiledöngüye girdi olarak alıntı yapardım .
0xC0000022L

8

Mac ve Linux'ta test edilen belirli bir dosyanın tüm parmak izlerini göstermenin taşınabilir bir yolu:

#!/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
}

Örnek Kullanım:

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 $ 

Bunu söylediğim için üzgünüm ama bu ne "basit", ne de "daha küçük", "akıllı" bile değil, yukarıda listelenenlerden başka bir yaklaşım izlemiyor. sadece daha fazla hata işleyicisini kullanan bir betik;)
childno͡.de

3
Hangisi daha güvenli kılar? Düzenlemeler yapabilirsiniz, ancak neden aşağı oy verdiniz? Sizinkinden daha iyi bir çözüm olduğunu önermedim ... Güvenli bir tempfilenin daha iyi olduğunu ve komut dosyası oluşturma amacıyla daha fazla güvenlik gerektiğini düşünüyorum. Ayrıca, yukarıdaki sürüm noclobber güvenlidir.
Will

FreeBSD sistemi için (varsayılan olarak bash kullanmayan), aşağıdaki değişiklikleri yaptım: bash'ın portlardan kurulduğunu varsayarak ilk satırı değiştirin #!/usr/local/bin/bash. Sonra son satır olarak bu ekleyerek fonksiyonu denir: fingerprint_keys $@. Komut dosyasını fingerprints.bashçalıştırılabilir olarak işaretleyerek olarak kaydettim chmod u+x ./fingerprints.bash. Ek olarak, bu cevabın bağlantısını içeren en üste yakın bir dosyaya bir yorum ekledim # solution from "Will" on SO http://serverfault.com/a/615892/126742. Öyle çağır ./fingerprints.bash ~/.ssh/authorized_keys.
derekv

1
@ derekv: daha taşınabilir yöntem şu hashbang'ı kullanmaktır: #!/usr/bin/env bashçünkü yolu envçok taşınabilir ve envbildiği Bash'i çalıştırmayı söyler .
0xC0000022L

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.