วิธีรับลายนิ้วมือทั้งหมดสำหรับไฟล์. ssh / authorized_keys (2)


39

มีวิธีง่ายๆในการรับรายการลายนิ้วมือทั้งหมดที่ป้อนใน. ssh / authorized_keys || หรือไม่ .ssh / authorized_keys2 ไฟล์?

ssh-keygen -l -f .ssh/authorized_keys 

จะคืนลายนิ้วมือของบรรทัดแรก / รายการ / publickey

แฮ็คกับ 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-keygenbaulks ที่ ฉันค้นหาวิธีที่เชื่อถือได้ในการแยกวิเคราะห์แต่สิ่งที่ดีที่สุดที่ฉันสามารถหาได้คือคำตอบนี้
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
nice @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
ซึ่งทำให้ปลอดภัยกว่าใช่ไหม คุณสามารถทำการแก้ไขได้ แต่ทำไม downvote ฉันไม่ได้เสนอว่ามันเป็นวิธีการแก้ปัญหาที่ดีกว่าของคุณ ... ฉันรู้สึกว่า tempfile ที่ปลอดภัยนั้นดีกว่าและต้องการความปลอดภัยที่มากขึ้นเพื่อจุดประสงค์ในการเขียนสคริปต์ นอกจากนี้เวอร์ชันด้านบนยังปลอดภัยสำหรับผู้ใช้ noclobber
จะ

สำหรับระบบ FreeBSD (ซึ่งไม่ได้ใช้ทุบตีโดยค่าเริ่มต้น) ผมทำการเปลี่ยนแปลงต่อไปนี้: สมมติว่าทุบตีมีการติดตั้งจากพอร์ต, #!/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ให้รัน Bash ที่มันรู้
0xC0000022L

7

หนึ่งซับขึ้นอยู่กับเคล็ดลับ/ dev / stdinจากคำตอบของℝaphinkและman xargs →ตัวอย่าง :

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.