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 이상 버전 ) 을 보여주는 답변을 추가 할 것이라고 생각했습니다 .
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
다음 텍스트는 이러한 명령의 작동 방식을 설명하고 이전 버전과 최신 버전의 OpenSSH 유틸리티 간의 동작 차이를 보여줍니다.
공개 호스트 키 가져 오기
이 ssh-keyscan
명령은 사용자가 SSH 서버에 대한 인증없이 공개 호스트 키를 얻을 수 있도록 개발되었습니다. 매뉴얼 페이지에서 :
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
Base64 키의 지문 해시 가져 오기
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 쉘 (예 :)을 사용하는 경우 임시 파일을 사용하는 다른 솔루션이 작동합니다. 단, (7.2) 이후 OpenSSH의 새 버전의 단순한 파이프 라인은 이후 사용될 수있는 ssh-keygen
허용 할 -
한 줄의 파이프 라인 명령을 허용하는 표준 입력 스트림의 파일명으로.
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 문서
답변
filezilla는 md5로 해시 된 키를 16 진수 형식으로 표시 합니다.
우분투 리눅스 머신 에서 이것을 찾으 려면 다음 명령을 사용하십시오 :
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
참고 : “localhost”를 확인하려는 시스템의 IP로 바꾸십시오.
답변
다음은 쉘 스크립트입니다 (주로 Bourne 쉘이지만 local
키워드를 사용하여 가장 현대적으로 사용 가능 /bin/sh
합니다). 처럼 사용하십시오 ssh-hostkey hostname
. 지정된 호스트 이름 또는 IP 주소의 모든 호스트 키에 대한 sha256 및 md5 형식 지문을 모두 표시합니다. 특정 형식 만 표시하기 위해 ” 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 "$@"