Come posso ottenere (solo) lo stato http di un sito in uno script di shell?


13

Immagino che il ricciolo farebbe il lavoro. Ho scritto in una sceneggiatura:

#!/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

Il problema qui non importa quello che faccio, non riesco a farlo per interrompere la stampa di seguito su stdout:

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

Voglio che un cronjob esegua questo script e se scrive un messaggio del genere ogni volta che lo eseguo riceverò un'e-mail perché qualcosa è stato stampato su stdout in cron, anche se il sito potrebbe andare bene.

Come posso ottenere il codice di stato senza portare spazzatura in stdout? Questo codice funziona tranne la spazzatura bonus allo stdout che mi impedisce di usarlo.

Risposte:


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

Quindi la tua ricerca dovrebbe assomigliare

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

Il risultato è Error 301 on google.com, ad esempio.


Grazie! questo mi ha irritato così tanto. (e dovrebbero menzionarlo sotto il "misuratore di progresso" nella pagina man)

10

tu vuoi

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

Questo ti darà il codice HTTP_STATUS come unico output.


2

Lo farei in questo modo per assicurarmi di essere reindirizzato all'host finale e ottenere la risposta da esso:

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

2

Usa questo come condizione ...

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

1

come sottolineato sopra l'arricciatura può fornire nativamente la risposta 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

L'esempio 1 con -snoi fa tacere i progressi e -o /dev/nullci consente di eliminare la risposta, ma -wqui è il tuo alleato:

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

Questo può essere ulteriormente semplificato nativamente in arricciatura chiedendo 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

Nell'esempio 2 vediamo la nostra risposta http iniziale, i domini richiesti originali e il reindirizzamento con cui il server ha risposto:

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

Tuttavia, se alla fine stai cercando di stabilire una risposta 200 anche dopo un reindirizzamento 301 o 302: Quindi puoi eliminare il suddetto 'redirect_url'

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

Esempio 3 aggiungiamo -Lquale incarica l'arricciatura di inseguire i reindirizzamenti:

$ ./example3.sh 
000 HTTP://mysite.com/
200 http://www.google.com/

Benvenuto in U&L. La tua prima frase afferma "come indicato sopra" che è confuso in quanto la posizione della tua risposta dipende dai voti e dalle impostazioni dell'utente. È meglio usare una riga "Come ha sottolineato @some_user" (con some_userun vero nome) o "Come altri hanno sottolineato"
Anthon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.