プログラムで SSHサーバーのキーフィンガープリントを取得する方法はありますか認証なし
私はしようとしています ssh -v user@Host false 2>&1 | grep "Server Host key"
、ただし、鍵ベースの認証が設定されていない場合、これはパスワードを待機してハングします。
これを行うには、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
は機能しません)
私は最近これを自分で行う必要があったので、プロセス置換を使用して、これをどのように( OpenSSH 7.2以降のバージョンで)で)1行で実行できるかを示す回答を追加したいと思いました。
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リリースでは、フェッチされる default キータイプはrsa
(バージョン5.1以降)、ecdsa
(バージョン6.0以降)、およびed25519
(バージョン6.7以降)。
古いバージョンのssh-keyscan
(OpenSSHバージョン5.1より前)では、 default のキータイプは古いrsa1
(SSHプロトコル1)ので、キータイプを明示的に指定する必要があります。
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
は、SSHサーバーのホストキーを Base64-encoded 形式で出力します。これをフィンガープリントハッシュに変換するには、ssh-keygen
ユーティリティを-l
オプションとともに使用して、指定した公開鍵のフィンガープリントを出力できます。
Bash、Zsh(またはKornシェル)を使用する場合、便利なワンライナーに プロセス置換 を使用できます。
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
注:バージョン7.2より前のOpenSSHでは、ssh-keygen
がファイルを読み取るために使用する関数は名前付きパイプ(FIFO)を適切に処理しなかったため、この方法は機能しませんでしたしたがって、一時ファイルを使用する必要があります。
ssh-keygen
printの最近のバージョンSHA256キーの指紋ハッシュ。 MD5サーバーキーフィンガープリントのハッシュ(古い動作)を取得するには、-E
オプションを使用してハッシュアルゴリズムを指定できます。
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
プロセス置換機能を備えていないPOSIXシェル(dash
など)を使用している場合、一時ファイルを使用する他のソリューションが機能します。ただし、OpenSSHの新しいバージョン(7.2以降)では、ssh-keygen
が-
を標準入力ストリームのファイル名として受け入れ、1行のパイプラインコマンドを許可するため、単純なパイプラインを使用できます。
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
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
filezillaは、md5でハッシュされたキーを16進数形式で表示します。
これをubuntu linuxマシンで見つけるには、次のコマンドを使用します。
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
注:「localhost」を、確認するマシンのIPに置き換えます。
これは、私がこれを行うために書いたシェルスクリプトです(主にBourne Shellですが、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 "$@"