.ssh / authorized_keys (2) 파일에 대한 모든 지문을 얻는 방법


39

.ssh / authorized_keys에 입력 한 모든 지문 목록을 얻는 간단한 방법이 있습니까? .ssh / authorized_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 ;) 1 주 : ssh-keygen -l -f /dev/stdin그럼에도 불구하고 맥 ..에 대한 작업에 서버 만 관련이 없습니다없는 것 같다 gnaa의 사과 또는 그것이 BSD "문제"입니다 점점 /dev/stdin is not a public key file.?!
childno͡.de

1
읽는 /dev/stdin것이 일반적으로 좋은 생각은 아니지만 사용하는 것이 더 -좋지만 어떤 이유로 ssh-keygen알지 못합니다 -.
ℝaphink

Mac에서 작동하지 않습니까?
Will

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
어느 것이 더 안전합니까? 편집을 환영하지만 왜 공감해야합니까? 나는 그것이 당신보다 더 나은 해결책이라고 제안하지 않았다 ... 나는 안전한 임시 파일이 더 좋다고 느끼고 스크립팅 목적에 더 많은 안전이 필요하다고 생각한다. 또한 위 버전은 클로버에 안전합니다.
Will

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.
derekv

1
@derekv : 더 휴대용 방법은 다음 hashbang을 사용하는 것입니다 #!/usr/bin/env bash, 경로가 있기 때문에 env매우 이식하고 지시 env가 알고 배쉬을 실행합니다.
0xC0000022L

7

aphink의 답변man xargs/ dev / stdin 트릭을 기반으로 한 라이너- :

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

이것은 훌륭하게 작동하며 하나의 라이너로 SSH를 통해 명령을 실행하는 데 쉽게 사용할 수 있습니다. 감사!
Thibaut Barrère
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.