Verificação de integridade da página da web usando curl

24

Gostaria de fazer uma verificação de integridade de um serviço ligando para um URL específico. Parece que a solução mais simples seria usar o cron para fazer o teste a cada minuto. Em caso de erros, o cron me envia um email.

Eu tentei usar o cUrl para isso, mas não consigo fazer com que ele envie mensagens apenas em erros. Se eu tentar direcionar a saída para / dev / null, ela imprimirá o relatório de progresso.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5559  100  5559    0     0   100k      0 --:--:-- --:--:-- --:--:--  106k

Eu tentei examinar as opções de curvas, mas não consigo encontrar nada para se adequar à situação em que você quer que ele fique em silêncio sobre o sucesso, mas faça barulho em caso de erros.

Existe uma maneira de fazer o curl fazer o que eu quero ou há alguma outra ferramenta que eu deveria estar olhando?

    
por palto 29.07.2013 / 17:26

7 respostas

30

Que tal -sSf ? Das man pages:

  -s/--silent
     Silent or quiet mode. Do not show progress meter or error messages.  
     Makes Curl mute.

  -S/--show-error
     When used with -s it makes curl show an error message if it fails.

  -f/--fail
     (HTTP)  Fail silently (no output at all) on server errors. This is mostly
     done to better enable scripts etc to better deal with failed attempts. In
     normal  cases  when a HTTP server fails to deliver a document, it returns
     an HTML document stating so (which often also describes  why  and  more).
     This flag will prevent curl from outputting that and return error 22.

     This method is not fail-safe and there are occasions where non-successful
     response codes will  slip  through,  especially  when  authentication  is
     involved (response codes 401 and 407).

Por exemplo:

curl -sSf http://example.org > /dev/null
    
por 29.07.2013 / 17:41
6

Você precisa do sinalizador -s (silencioso), -f (falha com o código de saída no erro) e pode usar o sinalizador -o para redirecionar a saída:

curl www.websiteToTest.com -s -f -o /dev/null || echo "Website down." | mail -s "Website is down" [email protected] 

Este é apenas um mau exemplo para um script cron simples. Normalmente, você deseja receber apenas um e-mail se um site estiver inativo.

    
por 29.07.2013 / 17:49
6

você pode capturar estatísticas de tempo de rede a partir de curvas. latências de cada fase em um ciclo de solicitação / resposta podem ser úteis para determinar a saúde.

$ URL=https://example.com
$ curl "$URL" -s -o /dev/null -w \
> "response_code: %{http_code}\n
> dns_time: %{time_namelookup}
> connect_time: %{time_connect}
> pretransfer_time: %{time_pretransfer}
> starttransfer_time: %{time_starttransfer}
> total_time: %{time_total}
> "
response_code: 200

dns_time: 0.029
connect_time: 0.046
pretransfer_time: 0.203
starttransfer_time: 0.212
total_time: 0.212
    
por 07.02.2017 / 20:56
5

Eu acho que a maneira mais simples de verificar se o site está vivo, então você pode usar o seguinte método:

     curl -Is http://www.google.com | head -n 1

Isso retornará HTTP/1.1 200 OK se o retorno não corresponder à sua saída e solicitar ajuda.

    
por 29.07.2013 / 17:48
1

Recentemente, pediram-me para apresentar algo que funcionasse mais como um batimento cardíaco sofisticado.

for i in 'curl -s -L cnn.com |egrep --only-matching "http(s?):\/\/[^ \"\(\)\<\>]*" | uniq' ; do curl -s -I $i 2>/dev/null |head -n 1 | cut -d$' ' -f2; done

Ou expandido para um pouco mais de legibilidade,

for i in $(curl -s -L cnn.com |egrep --only-matching 'http(s?):\/\/[^ \"\(\)\<\>]*' | uniq)
do
    curl -s -I "$i" 2>/dev/null | head -n 1 | cut -d' ' -f2
done

O que eu fiz foi curl um site, analisei todos os links do html e, em seguida, curl desses links analisados, exibindo apenas o código de status. Em seguida, eu procuraria por códigos de status http > = 400 para encontrar erros.

    
por 30.10.2015 / 21:38
1

Resposta:

#!/bin/bash -eu
timeout 3s curl -fIsS http://example.org > /dev/null
# and if you have TLS (https), check if it's about to expire:
true | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -checkend "$((3600*24*20))"

Explicações:

  • timeout 3s definirá um tempo limite de 3 segundos para sua solicitação. Respondendo mais devagar é consedered para ser "não saudável"
  • curl -f sinalizador falhará no início, -S mostrará erros, -s suprimirá a saída normal, -I somente buscará cabeçalhos HTTP, não o conteúdo. (Como sempre, mais detalhes estão disponíveis no comando man curl .)
  • A diretiva
  • openssl -checkend verifica as datas de expiração de um certificado. No meu exemplo, são 20 dias (especificados em segundos).
por 14.04.2017 / 21:00
1

Desta forma, irá ajudá-lo quando tentar testar o site quando o https estiver presente:

#!/bin/bash
# put your domain in this var
https=https://www.somewebsite.com

# save the status in some variable 
status='curl $https -k -s -f -o /dev/null && echo "SUCCESS" || echo "ERROR"'    

# print results (or use it in your scripts)
echo "testing $https=$status"
    
por 28.06.2017 / 17:37

Tags