Respostas:
Você pode fazer isso combinando ssh-keyscane 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
(infelizmente, o mais simples ssh-keyscan host | ssh-keygen -l -f /dev/stdinnão funciona)
ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -funciona da forma esperada no ssh-keygen 7.2 e superior. Ele produz algumas linhas de comentário para STDERR que podem ser filtradas, conforme mencionado na resposta de Anthony Geoghegan oussh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Recentemente, eu mesmo fiz isso, então pensei em adicionar uma resposta que mostra como isso pode ser feito (com versões do OpenSSH 7.2 ou mais recente ) em uma linha usando a substituição de processo:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
O texto a seguir explica como esses comandos funcionam e destaca algumas das diferenças de comportamento entre versões mais antigas e mais recentes dos utilitários OpenSSH.
O ssh-keyscancomando foi desenvolvido para que os usuários possam obter chaves de host públicas sem precisar se autenticar no servidor SSH. Na sua página de manual:
ssh-keyscané um utilitário para reunir as chaves públicas do host ssh de vários hosts. Foi desenvolvido para auxiliar na construção e verificação dessh_known_hostsarquivos.
O tipo de chave a ser buscada é especificado usando a -topção
rsa1 (Protocolo SSH obsoleto versão 1)rsadsaecdsa (versões recentes do OpenSSH)ed25519 (versões recentes do OpenSSH)Nas versões modernas do OpenSSH, os tipos de chave padrão a serem buscados são rsa
(desde a versão 5.1), ecdsa(desde a versão 6.0) e ed25519(desde a versão 6.7).
Com versões mais antigas de ssh-keyscan(antes OpenSSH versão 5.1), o
padrão tipo de chave foi o datada-out rsa1(SSH Protocolo 1) para os principais tipos precisaria ser explicitamente especificadas:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscanimprime a chave do host do servidor SSH no
formato codificado em Base64 . Para converter isso em um hash de impressão digital, o ssh-keygenutilitário pode ser usado com a -lopção de imprimir a impressão digital da chave pública especificada.
Se você estiver usando o Bash, o Zsh (ou o shell Korn), a substituição do processo pode ser usada para uma única linha:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Nota : Nas versões do OpenSSH anteriores à 7.2, as funções usadas
ssh-keygenpara ler arquivos não processavam muito bem os pipes nomeados (FIFOs), portanto esse método não funcionava, exigindo o uso de arquivos temporários.
Versões recentes dos hashes de ssh-keygenimpressão digital SHA256 das teclas. Para obter hashes MD5 das impressões digitais da chave do servidor (o comportamento antigo), a -E
opção pode ser usada para especificar o algoritmo de hash:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Se estiver usando um shell POSIX (como dash) que não possui substituição de processo, as outras soluções que usam arquivos temporários funcionarão. No entanto, com as versões mais recentes do OpenSSH (desde 7.2), um pipeline simples pode ser usado, pois ssh-keygenaceita -como um nome de arquivo para o fluxo de entrada padrão, permitindo um comando de pipeline de uma linha.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygennas versões mais antigas do OpenSSH, tenha um problema ao ler o FIFO / pipe nomeado. Vou analisar isso (e atualizar minha resposta) quando tiver algum tempo livre.
printfinstruções de depuração na do_fingerprint()função, descobri que nas versões do OpenSSH anteriores à 7.2, as funções usadas ssh-keygenpara ler arquivos, não tratavam muito bem os pipes nomeados (FIFOs), então o método de substituição do processo não funcionaria.
nmapfornece essa capacidade usando o ssh-hostkeyscript
Para retornar a impressão digital hexadecimal da chave:
$ nmap [SERVER] --script ssh-hostkey
Para retornar o conteúdo da chave:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Para retornar o balão visual da chave
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
Para retornar todas as opções acima:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Fonte: nmap docs
-popção que pode especificar uma porta, por exemplo -p 22000. Também é possível usar a -vvopção de aumentar a verbosidade (quantidade de informação dada)
Aqui está um script de shell (principalmente shell Bourne, mas usando a localpalavra-chave, disponível na maioria dos modernos /bin/sh) que escrevi para fazer isso. Use-o como ssh-hostkey hostname. Ele mostrará as impressões digitais nos formatos sha256 e md5 para todas as chaves do host para o nome do host ou endereço IP fornecido. Você também pode especificar manualmente " md5" ou " sha256" como o segundo argumento para mostrar apenas esse formato específico.
Ele usa um arquivo temporário em vez de canalizar para torná-lo compatível com pacotes OpenSSH mais antigos (conforme descrito em outras respostas). O arquivo temporário usa /dev/shm(memória compartilhada), se disponível.
#!/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)sim?