回答:
あなたは組み合わせることにより、これを行うことができますssh-keyscan
と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
(残念ながら、はるかに単純なssh-keyscan host | ssh-keygen -l -f /dev/stdin
ものは動作しません)
ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
ssh-keygen 7.2以降で期待どおりに機能します。それはアンソニーGeogheganかによって答えで述べたように、除外することができるSTDERRにいくつかのコメント行を生成ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
私は最近自分でこれをしなければならなかったので、プロセス置換を使用して1行でこれをどのように行うことができるかを示す答えを追加すると思いました(OpenSSH 7.2以降のバージョンで):
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
次のテキストでは、これらのコマンドの機能を説明し、OpenSSHユーティリティの古いバージョンと新しいバージョンの動作の違いをいくつか強調しています。
このssh-keyscan
コマンドは、ユーザーがSSHサーバーへの認証を必要とせずに公開ホストキーを取得できるように開発されました。そのmanページから:
ssh-keyscan
多くのホストの公開SSHホストキーを収集するためのユーティリティです。ssh_known_hosts
ファイルの構築と検証を支援するために設計されました 。
フェッチするキーのタイプは、-t
オプションを使用して指定されます。
rsa1
(SSHプロトコルバージョン1を廃止)rsa
dsa
ecdsa
(OpenSSHの最新バージョン)ed25519
(OpenSSHの最新バージョン)最新のOpenSSHリリースでは、フェッチされるデフォルトのキータイプはrsa
(バージョン5.1以降)、ecdsa
(バージョン6.0以降)、およびed25519
(バージョン6.7以降)です。
では古いバージョンのssh-keyscan
(OpenSSHのバージョン5.1の前に)、
デフォルトのキータイプは時代遅れだったrsa1
(SSHプロトコル1)ので、キータイプが明示的に指定する必要があります:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
SSHサーバーのホストキーをBase64エンコード
形式で出力します。これを指紋ハッシュに変換するには、指定された公開鍵の指紋を印刷するオプションssh-keygen
とともにユーティリティを使用でき-l
ます。
Bash、Zsh(またはKornシェル)を使用している場合、便利なワンライナーにプロセス置換を使用できます。
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
注:7.2より前のOpenSSHのバージョンでは、ssh-keygen
ファイルの読み取りに使用される関数
は名前付きパイプ(FIFO)をうまく処理しなかったため、この方法は機能しないため、一時ファイルを使用する必要があります。
キーのssh-keygen
印刷SHA256指紋ハッシュの最近のバージョン。サーバーキーフィンガープリントのMD5ハッシュ(古い動作)を取得するには、-E
オプションを使用してハッシュアルゴリズムを指定できます。
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
dash
プロセス置換を特徴としないPOSIXシェル(など)を使用している場合、一時ファイルを使用する他のソリューションが機能します。ただし、OpenSSHの新しいバージョン(7.2以降)では、標準入力ストリームのファイル名としてssh-keygen
受け入れ-
られるため、シンプルなパイプラインを使用でき、1行のパイプラインコマンドを使用できます。
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygen
古いバージョンのOpenSSHでは、FIFO /名前付きパイプからの読み取りに問題があると思われます。空き時間ができたら、これについて調べます(そして、答えを更新します)。
printf
してdo_fingerprint()
関数にデバッグステートメントを挿入すると、ssh-keygen
ファイルを読み取るために使用される関数がOpenSSHの7.2より前のバージョンでは名前付きパイプ(FIFO)をうまく処理できないことがわかりました。プロセス置換メソッドは機能しません。
nmap
ssh-hostkey
スクリプトを使用してこの機能を提供します。
キーの16進数のフィンガープリントを返すには:
$ nmap [SERVER] --script ssh-hostkey
キーのコンテンツを返すには:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
キーのビジュアルバブルを返すには
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
上記のすべてを返すには:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
ソース:nmap docs
-p
ポートを指定できるオプションがあります-p 22000
。この-vv
オプションを使用して、詳細度(指定された情報量)を増やすこともできます
これはシェルスクリプトです(主にBourneシェルですが、local
キーワードを使用していますが、これは最新のもので利用可能です/bin/sh
)。のように使用しssh-hostkey hostname
ます。指定されたホスト名またはIPアドレスのすべてのホストキーについて、sha256およびmd5形式のフィンガープリントが表示されます。2番目の引数として「md5
」または「sha256
」を手動で指定して、その特定の形式のみを表示することもできます。
パイピングではなく一時ファイルを使用して、古いOpenSSHパッケージと互換性を持たせます(他の回答で説明されています)。一時ファイルは/dev/shm
、使用可能な場合(共有メモリ)を使用します。
#!/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)
そうですか?