Cách nhận tất cả dấu vân tay cho tệp .ssh / ủy quyền (2)


39

Có cách nào đơn giản để nhận danh sách tất cả dấu vân tay được nhập trong .ssh / ủy quyền không | | .ssh / ủy quyền_key2 tập tin?

ssh-keygen -l -f .ssh/authorized_keys 

sẽ chỉ trả lại dấu vân tay của dòng đầu tiên / mục nhập / khóa công khai

hack với 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"
        )
    }
}'

Nhưng có một cách dễ dàng hơn hoặc lệnh ssh tôi không tìm thấy?


Để làm điều này một cách đáng tin cậy, bạn phải xem xét trường tùy chọn trong authorized_keystệp mà ssh-keygenbaulks tại. Tôi tìm kiếm một cách đáng tin cậy để phân tích nó nhưng cách tốt nhất tôi có thể đưa ra được bao phủ bởi câu trả lời này .
starfry

Câu trả lời:


45

Đây là một hack khác sử dụng bash plain mà không có tập tin tạm thời:

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

Bạn có thể dễ dàng biến nó thành một chức năng trong .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}"
}

và gọi nó bằng:

$ fingerprints .ssh/authorized_keys

1
tốt đẹp @Raphink, cảm ơn bạn. đã thêm code.childno.de/marcel/changeset/afdce0dd ;) Một lưu ý: ssh-keygen -l -f /dev/stdindường như không hoạt động trên máy mac .. tuy nhiên không liên quan đến máy chủ nhưng gnaa apple hoặc đó là "vấn đề" của BSD /dev/stdin is not a public key file.?
childno͡.de

1
Đọc từ /dev/stdinkhông phải là một ý tưởng tuyệt vời nói chung, nó tốt hơn để sử dụng -, nhưng vì một số lý do ssh-keygenkhông biết về -...
ℝaphink

Không hoạt động trên Mac?
Sẽ

1
Điều này không hoạt động nếu các khóa được tiền tố với các tùy chọn.
starfry

1
@ Aphink: Tôi muốn cho local file="${1:-$HOME/.ssh/authorized_keys}"phép nó hoạt động mà không có bất kỳ đối số nào và mặc định cho ~/.ssh/authorized_keystệp thông thường và trích dẫn < "$file"được sử dụng làm đầu vào cho whilevòng lặp.
0xC0000022L

8

Đây là một cách di động để hiển thị tất cả dấu vân tay chính cho một tệp nhất định, được thử nghiệm trên Mac và 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
}

Cách sử dụng ví dụ:

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 $ 

rất tiếc phải nói điều đó nhưng điều đó không "đơn giản" hơn, cũng không "nhỏ hơn" thậm chí không "thông minh hơn" và không thực hiện một cách tiếp cận nào khác được liệt kê ở trên. chỉ là một tập lệnh sử dụng nhiều trình xử lý lỗi hơn;)
childno͡.de

3
Mà làm cho nó an toàn hơn, phải không? Bạn được chào đón để chỉnh sửa nhưng tại sao downvote? Tôi đã không đề xuất rằng đó là bất kỳ loại giải pháp nào tốt hơn của bạn ... Tôi cảm thấy một tempfile an toàn là tốt hơn và cần nhiều sự an toàn hơn cho các mục đích kịch bản. Ngoài ra, phiên bản trên là noclobber an toàn.
Sẽ

Đối với hệ thống FreeBSD (không sử dụng bash theo mặc định), tôi đã thực hiện các thay đổi sau: Giả sử bash được cài đặt từ các cổng, thay đổi dòng đầu tiên thành #!/usr/local/bin/bash. Sau đó tôi đã gọi hàm bằng cách thêm dòng này làm dòng cuối cùng : fingerprint_keys $@. Tôi đã lưu tập lệnh như fingerprints.bash, đánh dấu nó có thể thực thi được chmod u+x ./fingerprints.bash. Ngoài ra, tôi đã thêm một nhận xét vào tệp có liên kết đến câu trả lời này, giống như vậy, gần đầu trang # solution from "Will" on SO http://serverfault.com/a/615892/126742. Gọi nó như vậy ./fingerprints.bash ~/.ssh/authorized_keys.
derekv

1
@derekv: phương pháp di động hơn là sử dụng hàm băm sau : #!/usr/bin/env bash, vì đường dẫn cho envrất dễ mang theo và nó bảo envthực hiện Bash mà nó biết.
0xC0000022L

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.