Jawaban:
Anda dapat melakukan ini dengan menggabungkan ssh-keyscan
dan 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
(sayangnya yang lebih sederhana ssh-keyscan host | ssh-keygen -l -f /dev/stdin
tidak berfungsi)
ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
bekerja seperti yang diharapkan pada ssh-keygen 7.2 dan di atasnya. Ini menghasilkan beberapa baris komentar untuk STDERR yang dapat disaring, seperti yang disebutkan dalam jawaban oleh Anthony Geoghegan ataussh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Saya baru-baru ini harus melakukan ini sendiri jadi saya pikir saya akan menambahkan jawaban yang menunjukkan bagaimana hal ini dapat dilakukan (dengan versi OpenSSH 7.2 atau lebih baru ) dalam satu baris menggunakan proses substitusi:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Teks berikut ini menjelaskan cara kerja perintah ini dan menyoroti beberapa perbedaan perilaku antara versi OpenSSH yang lebih lama dan yang lebih baru.
The ssh-keyscan
perintah dikembangkan sehingga pengguna dapat memperoleh kunci publik tuan rumah tanpa perlu otentikasi ke server SSH. Dari halaman manualnya:
ssh-keyscan
adalah utilitas untuk mengumpulkan kunci host ssh publik dari sejumlah host. Itu dirancang untuk membantu dalam membangun dan memverifikasissh_known_hosts
file.
Jenis kunci yang akan diambil ditentukan menggunakan -t
opsi.
rsa1
(Protokol SSH versi usang 1)rsa
dsa
ecdsa
(versi terbaru dari OpenSSH)ed25519
(versi terbaru dari OpenSSH)Dalam rilis OpenSSH modern, tipe kunci default yang akan diambil adalah rsa
(sejak versi 5.1), ecdsa
(sejak versi 6.0), dan ed25519
(sejak versi 6.7).
Dengan versi dari ssh-keyscan
(sebelum OpenSSH versi 5.1), yang
standar jenis kunci adalah keluar-tanggal rsa1
(SSH Protokol 1) sehingga jenis kunci akan perlu secara eksplisit ditentukan:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
mencetak kunci host dari server SSH dalam
format yang disandikan Base64 . Untuk mengonversi ini menjadi hash sidik jari, ssh-keygen
utilitas dapat digunakan dengan -l
opsi untuk mencetak sidik jari dari kunci publik yang ditentukan.
Jika menggunakan Bash, Zsh (atau Korn shell), substitusi proses dapat digunakan untuk satu-liner yang praktis:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Catatan : Dengan versi OpenSSH sebelum 7.2, fungsi yang digunakan
ssh-keygen
untuk membaca file, tidak menangani pipa bernama (FIFOs) dengan sangat baik sehingga metode ini tidak akan berfungsi, sehingga membutuhkan penggunaan file sementara.
Versi terbaru dari ssh-keygen
cetakan hash sidik jari SHA256 . Untuk mendapatkan hash MD5 dari sidik jari kunci server (perilaku lama), -E
opsi dapat digunakan untuk menentukan algoritma hash:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Jika menggunakan shell POSIX (seperti dash
) yang tidak menampilkan subtitusi proses, solusi lain menggunakan file sementara akan berfungsi. Namun, dengan versi OpenSSH yang lebih baru (sejak 7.2), sebuah pipa sederhana dapat digunakan karena ssh-keygen
akan menerima -
sebagai nama file untuk aliran input standar, yang memungkinkan perintah pipa satu baris.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygen
dari versi OpenSSH yang lama memiliki masalah dalam membaca dari pipa FIFO / bernama. Saya akan melihat ini (dan memperbarui jawaban saya) ketika saya mendapatkan waktu luang.
printf
pernyataan debugging dalam do_fingerprint()
fungsi, saya menemukan bahwa dengan versi OpenSSH sebelum 7.2, fungsi yang digunakan ssh-keygen
untuk membaca file, tidak menangani pipa bernama (FIFOs) dengan sangat baik sehingga metode substitusi proses tidak akan berfungsi.
nmap
menyediakan kemampuan ini dengan menggunakan ssh-hostkey
skrip.
Untuk mengembalikan sidik jari heksadesimal kunci:
$ nmap [SERVER] --script ssh-hostkey
Untuk mengembalikan konten kunci:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Untuk mengembalikan gelembung visual kunci
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
Untuk mengembalikan semua hal di atas:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Sumber: nmap docs
-p
opsi yang dapat menentukan port, mis -p 22000
. Dimungkinkan juga untuk menggunakan -vv
opsi untuk meningkatkan verbositas (jumlah informasi yang diberikan)
Berikut ini adalah skrip shell (terutama shell Bourne tetapi menggunakan local
kata kunci, yang tersedia di sebagian besar modern /bin/sh
) saya sudah menulis untuk melakukan ini. Gunakan seperti ssh-hostkey hostname
. Ini akan menunjukkan sidik jari format sha256 dan md5 untuk semua hostkeys untuk nama host atau alamat IP yang diberikan. Anda juga dapat secara manual menentukan " md5
" atau " sha256
" sebagai argumen kedua untuk hanya menampilkan format tertentu.
Ia menggunakan file temporer bukannya perpipaan untuk membuatnya kompatibel dengan paket OpenSSH yang lebih lama (seperti yang dijelaskan dalam jawaban lain). File sementara menggunakan /dev/shm
(memori bersama) jika tersedia.
#!/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)
?