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

13

Eu acho que 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 não importa o que eu faça, não consigo parar de imprimir o abaixo para stdout:

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

Eu quero que um cronjob execute esse script e, se ele escrever essa mensagem, toda vez que eu o executar, receberei um email porque algo foi impresso como stdout no cron, mesmo que o site esteja funcionando bem.

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

Jeff Schaller
fonte

Respostas:

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

Portanto, sua resolução deve parecer

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

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

ДМИТРИЙ МАЛИКОВ
fonte
Obrigado! isso me irritou muito. (e eles devem mencionar isto sob o "medidor de progresso" na página man)
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.

Tim Kennedy
fonte
2

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

res=($(curl -sLI "${1}" | grep '^HTTP/1' | tail -1))
((res[1] == 200)) || echo ${res[2]}
nicerobot
fonte
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
UNIXMAN
fonte
1

conforme indicado 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: -ssilenciamos o progresso e -o /dev/nulldeixamos a resposta para o lixo, mas -wé seu aliado aqui:

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

Isso pode ser simplificado ainda mais nativamente em curl, solicitando o url_effective e 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

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

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

No entanto, se você deseja estabelecer uma resposta 200 mesmo após um redirecionamento 301 ou 302: Em seguida, 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

No exemplo 3, adicionamos -Lquais instruções curl para perseguir os redirecionamentos:

$ ./example3.sh 
000 HTTP://mysite.com/
200 http://www.google.com/
Pista esquerda para dentro
fonte
Bem-vindo ao U&L. Sua primeira frase indica "como indicado acima", o que é confuso, pois a posição da sua resposta depende dos votos e das configurações do usuário. É melhor usar alguma linha "Como @some_user apontado acima" (com some_usersendo um nome real) ou "Como outros apontaram"
Anthon