Teste explícito para alteração da chave do host SSH

2

Estou escrevendo alguns automatismos e me deparei com um problema em que a chave de um host mudou e uma chave inglesa foi lançada nos trabalhos. Gostaria de adicionar uma verificação antes do voo para essa condição específica, mas não consigo obter ssh para retornar nada mais do que seu código de retorno 255.

por exemplo:

$ ssh -o StrictHostKeyChecking=yes foobar@squiffy-host ls; echo $?
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
...snip...
255

Como posso detectar este caso específico ?

    
por Sammitch 01.06.2017 / 22:38

2 respostas

0

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.

    
por 02.06.2017 / 21:24
0

Criando um pouco no seu snippit de shell, você pode tentar:

$ ssh -o StrictHostKeyChecking=yes foobar@squiffy-host ls 2>&1 |grep "WARNING: POSSIBLE DNS SPOOFING DETECTED" >/dev/null; echo $?
0

Deve dar saída 0 se a chamada grep encontrar a mensagem de erro, e 1 se não for.

    
por 01.06.2017 / 23:36

Tags