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


39

Existe-t-il un moyen simple d’obtenir une liste de toutes les empreintes digitales entrées dans le fichier .ssh / allowed_keys || Fichier .ssh / registered_keys2?

ssh-keygen -l -f .ssh/authorized_keys 

renverra uniquement les empreintes digitales de première ligne / entrée / publickey

bidouille 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 existe-t-il un moyen plus simple ou une commande ssh que je n'ai pas trouvée?


Pour le faire de manière fiable, vous devez prendre en compte le champ d’options dans le authorized_keysfichier, auquel les utilisateurs ssh-keygenmanquent. Je cherchais un moyen fiable de l’analyser, mais le mieux que je puisse trouver est couvert par cette réponse .
starfry

Réponses:


45

Voici un autre hack utilisant plain 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 appelez-le avec:

$ fingerprints .ssh/authorized_keys

1
sympa @Raphink, merci. ajouté code.childno.de/marcel/changeset/afdce0dd ;) Une remarque: ssh-keygen -l -f /dev/stdinsemble ne pas fonctionner sur un mac .. néanmoins non pertinent pour les serveurs, mais gnaa apple ou est-ce un "problème" BSD obtenir /dev/stdin is not a public key file.?!
childno͡.de

1
Lire de /dev/stdinn'est pas une bonne idée en général, il vaut mieux l'utiliser -, mais pour une raison quelconque, on ssh-keygenne le sait pas -...
aphink

Ne fonctionne pas sur Mac?
Will

1
Cela ne fonctionne pas si les clés sont préfixées avec des options.
starfry

1
@ ℝaphink: Je préférerais local file="${1:-$HOME/.ssh/authorized_keys}"que cela fonctionne sans aucun argument. Par défaut, le ~/.ssh/authorized_keysfichier habituel est cité et la citation est < "$file"utilisée comme entrée de la whileboucle.
0xC0000022L

8

Voici un moyen portable d'afficher toutes les empreintes 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 $ 

désolé de dire cela, mais ce n'est ni "plus simple", ni "plus petit" ni même "plus intelligent" et ne prend pas une autre approche que celle indiquée ci-dessus. juste un script utilisant plus de gestionnaires d'erreur;)
childno͡.de

3
Ce qui le rend plus sûr, non? Vous êtes le bienvenu pour faire des modifications, mais pourquoi un vote négatif? Je n'ai pas proposé qu'il s'agisse d'une meilleure solution que la vôtre ... Je pense qu'un fichier temporaire sécurisé est préférable, et qu'une sécurité accrue est nécessaire pour les scripts. De plus, la version ci-dessus est compatible avec noclobber.
Will

Pour un système FreeBSD (qui n'utilise pas bash par défaut), j'ai apporté les modifications suivantes: En supposant que bash est installé à partir des ports, remplacez la première ligne par #!/usr/local/bin/bash. J'ai alors appelé la fonction en ajoutant ce que la dernière ligne: fingerprint_keys $@. J'ai sauvegardé le script en le fingerprints.bashmarquant comme exécutable chmod u+x ./fingerprints.bash. De plus, j'ai ajouté un commentaire au fichier avec le lien vers cette réponse, comme ci-dessus, vers le haut # solution from "Will" on SO http://serverfault.com/a/615892/126742. Appelez ça comme ça ./fingerprints.bash ~/.ssh/authorized_keys.
derekv

1
@derekv: la méthode la plus portable consiste à utiliser le hashbang suivant:, #!/usr/bin/env bashparce que le chemin d'accès envest très portable et qu'il demande envd'exécuter le Bash dont il a connaissance.
0xC0000022L

7

Un one-liner basé sur l' astuce / dev / stdin de la réponse de ℝaphink et man xargs → EXEMPLES :

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

Cela fonctionne très bien et, étant donné qu'il s'agit d'une ligne, vous pouvez facilement utiliser la commande via SSH. Merci!
Thibaut Barrère
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.