Câu trả lời:
Bạn có thể làm điều này bằng cách kết hợp ssh-keyscan
và ssh-keygen
:
$ file=$(mktemp)
$ ssh-keyscan host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA)
$ rm $file
(tiếc là đơn giản hơn nhiều ssh-keyscan host | ssh-keygen -l -f /dev/stdin
không hoạt động)
ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
không hoạt động nhiều như mong đợi trong ssh-keygen 7.2 trở lên. Nó tạo ra một số dòng bình luận cho STDERR có thể được lọc ra, như được đề cập trong câu trả lời của Anthony Geoghegan hoặcssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Gần đây tôi đã phải tự làm điều này vì vậy tôi nghĩ rằng tôi đã thêm một câu trả lời cho thấy cách thực hiện điều này (với các phiên bản OpenSSH 7.2 hoặc mới hơn ) trong một dòng bằng cách sử dụng thay thế quy trình:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Văn bản sau đây giải thích cách các lệnh này hoạt động và nêu bật một số khác biệt về hành vi giữa các phiên bản cũ hơn và mới hơn của các tiện ích OpenSSH.
Các ssh-keyscan
lệnh được phát triển để người dùng có thể có được host key nào mà không cần phải xác thực đến máy chủ SSH. Từ trang người đàn ông của nó:
ssh-keyscan
là một tiện ích để thu thập các khóa máy chủ ssh công khai của một số máy chủ lưu trữ. Nó được thiết kế để hỗ trợ xây dựng và xác minhssh_known_hosts
các tập tin.
Loại khóa cần tìm nạp được chỉ định bằng -t
tùy chọn.
rsa1
(Giao thức SSH lỗi thời phiên bản 1)rsa
dsa
ecdsa
(các phiên bản gần đây của OpenSSH)ed25519
(các phiên bản gần đây của OpenSSH)Trong các bản phát hành OpenSSH hiện đại, các loại khóa mặc định được tìm nạp là rsa
(kể từ phiên bản 5.1), ecdsa
(kể từ phiên bản 6.0) và ed25519
(kể từ phiên bản 6.7).
Với các phiên bản cũ của ssh-keyscan
(trước OpenSSH phiên bản 5.1), các
mặc định loại chính là out-ngày rsa1
(SSH Nghị định thư 1) để các loại chìa khóa sẽ cần phải được quy định một cách rõ ràng:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
in khóa máy chủ của máy chủ SSH ở
định dạng được mã hóa Base64 . Để chuyển đổi điều này thành băm dấu vân tay, ssh-keygen
tiện ích có thể được sử dụng với -l
tùy chọn của nó để in dấu vân tay của khóa chung được chỉ định.
Nếu sử dụng Bash, Zsh (hoặc vỏ Korn), có thể sử dụng thay thế quy trình cho một lớp lót tiện dụng:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Lưu ý : Với các phiên bản OpenSSH trước 7.2, các chức năng được sử dụng
ssh-keygen
để đọc tệp, không xử lý tốt các đường ống có tên (FIFO) nên phương pháp này sẽ không hoạt động, do đó yêu cầu sử dụng các tệp tạm thời.
Các phiên bản gần đây của ssh-keygen
bản in dấu vân tay SHA256 của các phím. Để có được băm MD5 của dấu vân tay khóa máy chủ (hành vi cũ), -E
tùy chọn có thể được sử dụng để chỉ định thuật toán băm:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Nếu sử dụng trình bao POSIX (chẳng hạn như dash
) không có tính năng thay thế quy trình, các giải pháp khác sử dụng tệp tạm thời sẽ hoạt động. Tuy nhiên, với các phiên bản mới hơn của OpenSSH (kể từ 7.2), một đường ống đơn giản có thể được sử dụng vì ssh-keygen
sẽ chấp nhận -
làm tên tệp cho luồng đầu vào tiêu chuẩn, cho phép lệnh đường ống một dòng.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygen
từ các phiên bản cũ hơn của OpenSSH có vấn đề khi đọc từ đường ống có tên là FIFO /. Tôi sẽ xem xét điều này (và cập nhật câu trả lời của tôi) khi tôi có thời gian rảnh.
printf
câu lệnh gỡ lỗi trong do_fingerprint()
hàm, tôi thấy rằng với các phiên bản OpenSSH trước 7.2, các hàm được sử dụng ssh-keygen
để đọc tệp, không xử lý tốt các ống có tên (FIFO) phương pháp thay thế quá trình sẽ không hoạt động.
nmap
cung cấp khả năng này bằng cách sử dụng ssh-hostkey
tập lệnh.
Để trả về dấu vân tay thập lục phân của khóa:
$ nmap [SERVER] --script ssh-hostkey
Để trả về nội dung của khóa:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Để trả lại bong bóng trực quan của khóa
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
Để trả lại tất cả những điều trên:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Nguồn: tài liệu nmap
-p
tùy chọn mà có thể chỉ định một cổng, ví dụ -p 22000
. Bạn cũng có thể sử dụng -vv
tùy chọn để tăng mức độ chi tiết (lượng thông tin đã cung cấp)
Đây là một kịch bản shell (chủ yếu là shell Bourne nhưng sử dụng local
từ khóa, có sẵn trong hầu hết các hiện đại /bin/sh
) Tôi đã viết để làm điều này. Sử dụng nó như thế nào ssh-hostkey hostname
. Nó sẽ hiển thị cả dấu vân tay định dạng sha256 và md5 cho tất cả các máy chủ lưu trữ cho tên máy chủ hoặc địa chỉ IP đã cho. Bạn cũng có thể chỉ định thủ công " md5
" hoặc " sha256
" làm đối số thứ hai để chỉ hiển thị định dạng cụ thể đó.
Nó sử dụng một tệp tạm thời thay vì đường ống để làm cho nó tương thích với các gói OpenSSH cũ hơn (như được mô tả trong các câu trả lời khác). Các tập tin tạm thời sử dụng /dev/shm
(bộ nhớ chia sẻ) nếu có sẵn.
#!/bin/sh
usage () {
printf '%s\n' "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]"
}
ssh_hostkey () {
local host="$1"
local fprinthash="$2"
local tmp=
case "$host" in
-h|--help|'')
usage >&2
return 1
;;
esac
case "$fprinthash" in
md5|sha256|'') true;;
*)
usage >&2
printf '%s\n' "Fingerprint hash may be 'md5' or 'sha256'" >&2
return 2
;;
esac
if test -d /dev/shm
then tmp="$(mktemp -d -p /dev/shm)"
else tmp="$(mktemp -d)"
fi
trap 'trap - INT TERM EXIT; rm -rf "$tmp"' INT TERM EXIT
ssh-keyscan "$host" > "$tmp/f" 2> /dev/null
case "$fprinthash" in
sha256|'') ssh-keygen -l -f "$tmp/f" 2> /dev/null;;
esac
case "$fprinthash" in
md5|'') ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;;
esac
trap - INT TERM EXIT
rm -rf "$tmp" > /dev/null 2>&1
}
ssh_hostkey "$@"
ssh-keygen -l -f - <(ssh-keyscan host)
nào, mặc dù?