Cara mendapatkan semua sidik jari untuk file .ssh / authorized_keys (2)

39

Apakah ada cara sederhana untuk mendapatkan daftar semua sidik jari yang dimasukkan dalam .ssh / Authorized_key || File .ssh / Authorized_keys2?

ssh-keygen -l -f .ssh/authorized_keys 

hanya akan mengembalikan sidik jari dari baris / entri / publickey pertama

retas dengan awk:

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

tetapi apakah ada cara yang lebih mudah atau perintah ssh yang tidak saya temukan?

childno͡.de
sumber
Untuk melakukan ini dengan andal, Anda harus mempertimbangkan bidang opsi dalam authorized_keysfile, di mana ssh-keygenbaulks di. Saya mencari cara yang dapat diandalkan untuk menguraikannya tetapi yang terbaik yang bisa saya temukan tercakup dalam jawaban ini .
Starfry

Jawaban:

45

Berikut ini hack lain menggunakan bash polos tanpa file sementara:

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

Anda dapat dengan mudah menjadikannya fungsi di .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}"
}

dan menyebutnya dengan:

$ fingerprints .ssh/authorized_keys
ℝaphink
sumber
1
@Raphink yang bagus, terima kasih. menambahkan code.childno.de/marcel/changeset/afdce0dd ;) Satu catatan: ssh-keygen -l -f /dev/stdintampaknya tidak bekerja di mac .. namun tidak relevan untuk server tetapi gnaa apple atau apakah itu "masalah" BSD /dev/stdin is not a public key file.?
childno͡.de
1
Membaca dari /dev/stdinbukanlah ide yang bagus secara umum, lebih baik digunakan -, tetapi untuk beberapa alasan ssh-keygentidak tahu tentang -...
ℝaphink
Tidak berfungsi di Mac?
Will
1
Ini tidak berfungsi jika kunci diawali dengan opsi.
starfry
1
@ Acink: Aku akan pergi untuk local file="${1:-$HOME/.ssh/authorized_keys}"memungkinkan untuk bekerja tanpa argumen dan default ke ~/.ssh/authorized_keysfile biasa dan mengutip yang < "$file"digunakan sebagai input ke whileloop.
0xC0000022L
8

Berikut adalah cara portabel untuk menampilkan semua sidik jari kunci untuk file yang diberikan, diuji pada Mac dan Linux:

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

Contoh penggunaan:

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 $ 
Akan
sumber
maaf untuk mengatakan itu tetapi itu bukan "sederhana", atau "lebih kecil" bahkan tidak "lebih pintar" dan tidak mengambil pendekatan lain dari yang tercantum di atas. hanya sebuah skrip yang menggunakan lebih banyak penangan kesalahan;)
childno͡.de
3
Yang membuatnya lebih aman, bukan? Anda boleh melakukan pengeditan tetapi mengapa downvote? Saya tidak mengusulkan bahwa itu adalah solusi yang lebih baik daripada milik Anda ... Saya merasa tempfile yang aman lebih baik, dan bahwa dibutuhkan lebih banyak keamanan untuk keperluan penulisan skrip. Juga, versi di atas adalah noclobber-safe.
Will
Untuk sistem FreeBSD (yang tidak menggunakan bash secara default), saya membuat perubahan berikut: Dengan asumsi bash diinstal dari port, ubah baris pertama menjadi #!/usr/local/bin/bash. Saya kemudian disebut fungsi dengan menambahkan ini sebagai baris terakhir: fingerprint_keys $@. Saya menyimpan script sebagai fingerprints.bash, menandainya dengan executable chmod u+x ./fingerprints.bash. Selain itu, saya menambahkan komentar ke file dengan tautan ke jawaban ini, seperti itu, di dekat bagian atas # solution from "Will" on SO http://serverfault.com/a/615892/126742. Sebut saja seperti itu ./fingerprints.bash ~/.ssh/authorized_keys.
derekv
1
@derekv: metode yang lebih portabel adalah dengan menggunakan hashbang berikut:, #!/usr/bin/env bashkarena path untuk envsangat portabel dan memberitahu envuntuk mengeksekusi Bash yang diketahuinya.
0xC0000022L
7

Satu kalimat berdasarkan trik / dev / stdin dari jawaban ℝaphink dan man xargs → CONTOH :

egrep '^[^#]' ~/.ssh/authorized_keys | xargs -n1 -I% bash -c 'ssh-keygen -l -f /dev/stdin <<<"%"'
alias
sumber
Ini berfungsi dengan baik, dan mengingat itu adalah satu-liner, dapat dengan mudah digunakan untuk menjalankan perintah melalui SSH. Terima kasih!
Thibaut Barrère