Як отримати всі відбитки пальців для файлу .ssh / pooblasti_keys (2)


39

Чи є простий спосіб отримати список усіх відбитків пальців, введених у .ssh / санкціоновані_кеї || .ssh / Author_keys2 файл?

ssh-keygen -l -f .ssh/authorized_keys 

поверне лише відбиток першого рядка / запису / відкритого ключа

рубати з 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"
        )
    }
}'

але чи є простіший спосіб чи команда ssh, яку я не знайшов?


Щоб зробити це надійно, вам слід врахувати поле параметрів у authorized_keysфайлі, в якому знаходиться програма ssh-keygen. Я шукав надійний спосіб проаналізувати його, але найкраще, що я міг би придумати, висвітлюється цією відповіддю .
starfry

Відповіді:


45

Ось ще один хак із використанням простого bash без тимчасових файлів:

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

Ви можете легко зробити його функцією у вашому .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}"
}

і зателефонуйте за допомогою:

$ fingerprints .ssh/authorized_keys

1
приємно @Raphink, дякую. додано code.childno.de/marcel/changeset/afdce0dd ;) Одне зауваження: ssh-keygen -l -f /dev/stdinначебто, не працює на mac .. все-таки не стосується серверів, але gnaa apple або це BSD "проблема" отримання /dev/stdin is not a public key file.?!
childno͡.de

1
Читання з /dev/stdin- це взагалі не чудова ідея, її краще використовувати -, але чомусь ssh-keygenне знаю про -...
ℝaphink

Не працює на Mac?
Буде

1
Це не працює, якщо ключі встановлені з опціями.
starfry

1
@ ℝaphink: Я б хотів local file="${1:-$HOME/.ssh/authorized_keys}"дозволити йому працювати без будь-яких аргументів і за замовчуванням у звичайному ~/.ssh/authorized_keysфайлі та навести < "$file"вживаний текст у whileциклі.
0xC0000022L

8

Ось портативний спосіб показати всі ключові відбитки пальців для певного файлу, перевіреного на Mac та 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
}

Приклад використання:

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 $ 

Вибачте, що сказати це, але це ні "спрощення", ні "менший", навіть не "розумніший" і не використовує іншого підходу, ніж зазначено вище. просто сценарій, що використовує більше обробників помилок;)
childno͡.de

3
Що робить його більш безпечним, правда? Ви можете внести зміни, але навіщо зволікати? Я не пропонував, щоб це було будь-яке краще рішення, ніж ваше ... Я вважаю, що захищений темпфіл краще, і що потрібно більше безпеки для сценаріїв. Крім того, наведена вище версія не є безпечною для noclobber.
Буде чи

Для системи FreeBSD (яка не використовує bash за замовчуванням), я вніс такі зміни: Припускаючи, що bash встановлений з портів, змінити перший рядок на #!/usr/local/bin/bash. Я тоді назвав функцію, додаючи це в останньому рядку: fingerprint_keys $@. Я зберег скрипт як fingerprints.bash, позначивши його виконуваним chmod u+x ./fingerprints.bash. Крім того, я додав коментар до файлу із посиланням на цю відповідь, як-от так, біля верхньої частини # solution from "Will" on SO http://serverfault.com/a/615892/126742. Назвіть це так ./fingerprints.bash ~/.ssh/authorized_keys.
дерев

1
@derekv: більш портативний метод полягає у використанні наступного хешбангу:, #!/usr/bin/env bashоскільки шлях до envдуже портативний, і він говорить envвиконати Bash, про який він знає.
0xC0000022L

7

Однорядний лайнер, заснований на фокусі / dev / stdin з відповіді Лафінка та man xargs → ПРИКЛАДИ :

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

Це чудово працює, а враховуючи, що це однолінійний, можна легко використовувати для запуску команди через SSH. Дякую!
Тібаут Барре
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.