Manipulação de conexão whois recusou mensagem no shell script

3
blacklist_ips='
    5.56.148.140
    94.73.159.66
    69.134.15.72
    107.150.42.226
    195.159.233.44
    89.19.7.58
'

for ipx in $blacklist_ips
do
    country='whois $ipx | grep -i country | tail -1 | awk '{print $2}''
    hostx='host $ipx |awk '{print $NF}'|sed "s/\.$//"'
    printf '%s %s %s' $country $ipx $hostx          
    printf '\n'
done

O script funciona para todos os IPs, mas para 69.134.15.72 ,

country='whois $ipx | grep -i country | tail -1 | awk '{print $2}''

resultados como:

connect: Connection refused

É por causa de

whois 69.134.15.72

Parece que 69.134.15.72 não responde corretamente.

Eu não entendo porque ele pára na linha de country e a execução do script não chega na próxima linha.

Como posso detectar o erro connection refused e reagir adequadamente?

    
por NecNecco 10.07.2016 / 23:37

1 resposta

5

Você pode fazer isso usando uma instrução if e echo $? para testar o status de saída do último comando. O número 0 normalmente corresponde a um sucesso. As falhas podem ser representadas por um intervalo de números, dependendo do programa.

Aqui, whois 69.134.15.72; echo $? produz um 2 por causa da mensagem Connection Refused .

A execução do comando para um endereço IP diferente que aceita a conexão produzirá um 0. Por exemplo:

$ whois 5.56.148.140 >/dev/null; echo $?
0

Nesse comando, eu redirecionei a saída para / dev / null para evitar desordem. Além disso, o sucesso ou a falha desse comando desses endereços IP neste post pode mudar no futuro.

Em seu código, você pode testar primeiro o comando whois para o endereço IP específico e, em seguida, executar somente o restante da instrução for se o status de saída for 0.

Algo como:

for ipx in $blacklist_ips
do

    whois_test='whois $ipx 2>/dev/null' 
    ret=$?

    if [ $ret -eq 0 ]; then
        country='echo "$whois_test" | grep -i country | tail -1 | awk '{print $2}''
        hostx='host $ipx |awk '{print $NF}'|sed "s/\.$//"'
        printf '%s %s %s' $country $ipx $hostx          
        printf '\n'
    fi

done

A sintaxe é a seguinte:

  1. Executa o comando whois no endereço IP e salva a saída como variável whois_test . stderr será redirecionado para / dev / null, não produzindo saída adicional na tela quando o comando falhar.
  2. Atribui valor do status de saída à variável ret .
  3. Se a instrução verificar se o valor da variável ret é 0. Se sim, continua com o conteúdo do seu loop.

A atribuição da variável country dentro do loop for mudou ligeiramente. Em vez de canalizar a saída do comando whois como originalmente gravado, o script agora canaliza o valor da variável whois_test .

São necessárias aspas duplas para reter a formatação para que grep encontre corretamente o valor correto para o país.

    
por 10.07.2016 / 23:41