Como obtenho (apenas) o status http de um site em um script de shell?

13

Eu acho que o curl faria o trabalho. Eu escrevi em um script:

#!/bin/sh

function test {
    res='curl -I $1 | grep HTTP/1.1 | awk {'print $2'}'
    if [ $res -ne 200 ]
    then
        echo "Error $res on $1"
    fi
}  

test mysite.com
test google.com

O problema aqui é que não importa o que eu faça Não consigo parar de imprimir o seguinte para stdout:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

Eu quero um cronjob para rodar este script e se ele gravar tal mensagem, toda vez que eu rodar ele, eu recebo um email porque algo foi impresso para stdout no cron, mesmo que o site esteja bem.

Como obtenho o código de status sem colocar lixo no stdout? Este código funciona, exceto o lixo de bônus para a stdout, impedindo-me de usá-lo.

    
por Jeff Schaller 09.12.2011 / 13:28

5 respostas

12
   -s/--silent
          Silent or quiet mode. Don't show progress meter 
          or error messages.  Makes Curl mute.

Assim, seu res deve ser parecido com

res='curl -s -I $1 | grep HTTP/1.1 | awk {'print $2'}'

O resultado é Error 301 on google.com , por exemplo.

    
por 09.12.2011 / 14:03
10

você quer

...
res=$( curl -w %{http_code} -s --output /dev/null $1)
...

Isso fornecerá o código HTTP_STATUS como a única saída.

    
por 09.12.2011 / 16:16
2

Eu faria assim para garantir que eu seja redirecionado para o host final e obtenha a resposta:

res=($(curl -sLI "${1}" | grep '^HTTP/1' | tail -1))
((res[1] == 200)) || echo ${res[2]}
    
por 09.12.2011 / 14:26
2

Use isso como sua condição ...

res='curl -s --head <URL> | head -n 1 | grep -c HTTP/1.1 200 OK'

if [ $res -eq 1 ]
then
MSG = " OKAY"
EXIT_CODE = 0
else
MSG = " NOT OKAY"
EXIT_CODE = 2
fi
    
por 28.07.2014 / 12:40
1

como apontado acima, o curl pode fornecer nativamente a resposta http:

#!/bin/bash
#example1.sh
function test {
  RESPONSE=$(curl -so /dev/null -w "%{http_code}\n" ${1})
  if [[ $RESPONSE != 200 ]]; then
    echo "Error ${RESPONSE} on ${1}"
  fi
}    
test mysite.com
test google.com

Exemplo 1 com -s nós silenciamos o progresso & -o /dev/null nos permite eliminar a resposta, mas -w é seu aliado aqui:

$ ./example1.sh 
Error 000 on mysite.com
Error 301 on google.com

Isso pode ser ainda mais simplificado de forma nativa, solicitando o url_effective e o redirect_url:

#!/bin/bash
#example2.sh
function test {
  curl -so /dev/null -w "%{http_code}\t%{url_effective}\t%{redirect_url}\n" ${1}
}  
test mysite.com
test google.com

Exemplo 2, vemos nossa resposta http inicial, domínios solicitados originais e redirecionamos o servidor respondido com:

$ ./example2.sh 
000 HTTP://mysite.com/  
301 HTTP://google.com/  http://www.google.com/

No entanto, se você está procurando estabelecer uma resposta de 200, mesmo após um redirecionamento 301 ou 302: Então, você pode soltar o "redirect_url"

acima mencionado
#!/bin/bash
#example3.sh
function test {
  curl -sLo /dev/null -w "%{http_code}\t%{url_effective}\n" ${1}
}  
test mysite.com
test google.com

Exemplo 3, adicionamos -L que instrui o curl a perseguir o (s) redirecionamento (s):

$ ./example3.sh 
000 HTTP://mysite.com/
200 http://www.google.com/
    
por 13.08.2016 / 09:38