Ho un problema. Ho bisogno di script bash, che corrisponda alle impronte digitali ssh in known_hosts e sul server remoto. Ecco cosa ho:
keyFile=$(mktemp)
ssh-keyscan -H $ip > $keyFile 2> /dev/null
hashRemote=$(ssh-keygen -f $keyFile -H -F $ip | sed -n -r -e 's/^[^#][^ ]+ [^ ]+ ([^ ]+)$/\1/p')
hashLocal=$(ssh-keygen -f ~/.ssh/known_hosts -H -F $ip | sed -n -r -e 's/^[^#][^ ]+ [^ ]+ ([^ ]+)$/\1/p')
rm $keyFile
echo $hashRemote
echo $hashLocal
Il problema è che l'output non è coerente. Il contenuto di known_hosts dipende dai tipi di chiavi supportati. Quindi, l'output di ssh-keygen è simile al seguente:
# Host 10.0.0.35 found: line 1 type RSA
|1|H24d9m0xG5zrw6QBkigVjarwTFw=|xpisuvwhtqsNkH0CJ6pYoB/y1G8= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB
AQC1Ge/M8bA7nQsbMPy8JmFo6T3Ls2FXR01HyHoW5uwTeW3EoaD39IemRYmkDHLZwlQiLSSrw/kgkHATtQ4pqyg0o5mJoajmw
czUQ78Poavea60OYXJWLh12uZlRjyiu/tQXdHaBI3YwCNnP827t4guvJjpdOAsFgZqfuX9qERGPJMHj0YqRelanB9Za3Fueb9
QsT8wOe/wPCw2YwGapUndcUMoChmN2YRMjRk1JU4DPXiQ56+A2S9V4iP+drZfoK3c3tCdUOVUxCPEwqCraav+viSNq2odVL9F
79jIGxP43TqUcCyMcFU7vGEVshVu7gvUl7KKCMa0wu5pr+Z1X3zUn
# Host 10.0.0.35 found: line 3 type ECDSA
|1|XdzrIRaJLfushc3efDRkNAJwqcQ=|UUyGx6z6I61mqMVRh/j/5+zs6eA= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNo
YTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLvteJqElWirJtA75IuDtvwKIbGfbvdCE+O/6bkFhj6oFlSVZqqecmm+MzRca
aLg30hLxLpO8bxwVxeVY62sDg8=
Un tipo è RSA e un tipo è ECDSA. La mia domanda è: posso in qualche modo abbinare known_hosts e impronta digitale remota? Grazie in anticipo...
ssh-keyscancon -tset su tutti i tipi di chiave supportati nella tua versione (vedi ssh -Q keyse 6.5 su) e mostrerà ciò che il server ha e ignora silenziosamente gli altri. Per scoprire cos'hai in un hash known_hosts, trova le linee ssh-keygen -F hostcome hai fatto e guarda ad esempio awk '!/^#/{print $2}'- o $(NF-1)se hai bisogno di occuparti di linee contenenti opzioni. Oppure sed, o grepse il tuo ha -Po(corrispondenza PCRE e output selettivo), o perl, o persino shell-builtin read; questo è piuttosto semplice.
ssh-keyscane il contenuto di unknown_hostsfile, dopo il primo token o talvolta due, sono la chiave pubblica effettiva, NON un'impronta digitale. Finché non si utilizza SSHv1 rotto e obsoleto, il formato è sempre una parola che indica il tipo seguito da un BLOB di base64. Ricorda che un server / host di solito ha più di un tipo di chiave pubblica; se si desiderassh-keyscanottenere un tipo particolare o un elenco di tipi (ad esempio per il confronto), utilizzare-tper la pagina man - ma si noti che potrebbe non essere il tipo e la chiave, utilizzati in unasshconnessione successiva .