54 votes

Comment obtenir toutes les empreintes digitales du fichier .ssh/authorized_keys(2) ?

Existe-t-il un moyen simple d'obtenir une liste de toutes les empreintes digitales saisies dans le fichier .ssh/authorized_keys || .ssh/authorized_keys2 ?

ssh-keygen -l -f .ssh/authorized_keys 

ne renvoie que l'empreinte digitale de la première ligne / entrée / clé publique

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

mais y a-t-il un moyen plus simple ou une commande ssh que je n'ai pas trouvée ?

61voto

raphink Points 10967

Voici un autre hack utilisant bash sans fichiers temporaires :

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

Vous pouvez facilement en faire une fonction dans votre .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}"
}

et l'appeler avec :

$ fingerprints .ssh/authorized_keys

12voto

akavel Points 337

Une ligne de conduite basée sur la méthode /dev/stdin astuce de Réponse de aphink et man xargs → EXEMPLES :

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

8voto

Will Points 1117

Voici un moyen portable d'afficher toutes les empreintes de clés d'un fichier donné, testé sur Mac et 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
}

Exemple d'utilisation :

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 $

5voto

Jon Bundesen Points 21
ssh-keygen -l -f - <authorized_keys

produit une belle liste pour vous :

# ssh-keygen -l -f - <authorized_keys
2048 SHA256:GzZ7.................................RqTEag foo (RSA)
2048 SHA256:/y0.......................................4 bar (RSA)
2048 SHA256:p.........................................k bleech (RSA)

1voto

user173218 Points 1

Et si quelqu'un a besoin de le faire sous Windows / dans PowerShell :

gc authorized_keys | foreach {$_ |ssh-keygen -l -f -}

ou la version complète sans alias qui recherche le répertoire de votre profil d'utilisateur :

(Get-Content ((Get-Content env:/userprofile)+"/.ssh/authorized_keys")) | foreach {$_ |ssh-keygen -l -f -}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X