A essa altura, não estou muito otimista de que haja uma resposta perfeita, então segui suas sugestões para analisar o texto do erro.
## Return codes:
# 0: No problem
# 1: Host key problem
# 2: Unhandled error
function testhostkey() {
user=$1
hostname=$2
res=$( ( ssh -o StrictHostKeyChecking=yes ${user}@${hostname} exit 1>/dev/null ) 2>&1 )
code=$?
if [ $code -eq 0 ]; then
return 0
elif [ $code -eq 255 ]; then
while read line; do
case "$line" in
'WARNING: POSSIBLE DNS SPOOFING DETECTED!')
continue
;;
'WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!')
continue
;;
*)
echo "Unhandled SSH error message: $line" >&2
echo "$res" >&2
return 2
;;
esac
done < <(echo "$res" | grep '^@\s\+' | sed 's/@\s\+\(.*\)\s\+@//' | sed -e 's/^\s\+//' -e 's/\s\+$//')
return 1
else
printf "Unhandled return code from SSH: %d\n%s\n" $code "$res" >&2
return 2
fi
}
Basicamente, SE o código de retorno é 255 AND todas as mensagens de erro estão dentro do conjunto especificado THEN o código de retorno é 1.
Todas as outras mensagens de erro / códigos retornam 2 e nenhum erro retorna 0.