¿Cómo obtengo (solo) el estado http de un sitio en un script de shell?

13

Me imagino que curl haría el trabajo. Escribí en un guión:

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

El problema aquí es que no importa lo que haga, no puedo hacer que deje de imprimir lo siguiente para stdout:

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

Quiero que un cronjob ejecute este script y si escribe un mensaje así, cada vez que lo ejecute, recibiré un correo electrónico porque algo se ha impreso en stdout en cron, aunque el sitio puede estar bien.

¿Cómo obtengo el código de estado sin poner basura en stdout? Este código funciona, excepto el bono basura para el stdout que me impide usarlo.

Jeff Schaller
fuente

Respuestas:

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

Entonces tu resolución debería verse como

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

El resultado es Error 301 on google.com, por ejemplo.

ДМИТРИЙ МАЛИКОВ
fuente
¡Gracias! Esto me irritó mucho. (y deben mencionar esto bajo la "barra de progreso" en la página man)
10

usted quiere

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

Eso le dará el código HTTP_STATUS como la única salida.

Tim Kennedy
fuente
2

Lo haría así para asegurarme de ser redirigido al host final y obtener la respuesta de él:

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

Use esto como su condición ...

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
fuente
1

como se señaló anteriormente, curl puede proporcionar de forma nativa la respuesta 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

El ejemplo 1 con -ssilenciamos el progreso y -o /dev/nullnos deja descartar la respuesta, pero -wes tu aliado aquí:

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

Esto se puede simplificar aún más de forma nativa en curl preguntando por url_effective y 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

Ejemplo 2 vemos nuestra respuesta http inicial, dominios solicitados originales y redirigimos el servidor respondió con:

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

Sin embargo, si finalmente está buscando establecer una respuesta 200 incluso después de una redirección 301 o 302: entonces puede y soltar el mencionado '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

Ejemplo 3 agregamos -Lque le indica a curl que persiga las redirecciones:

$ ./example3.sh 
000 HTTP://mysite.com/
200 http://www.google.com/
Pista dejada adentro
fuente
Bienvenido a U&L. Su primera oración dice "como se señaló anteriormente", lo cual es confuso ya que la posición de su respuesta depende de los votos y la configuración del usuario. Es mejor usar alguna línea "Como @some_user señaló arriba" (con some_userun nombre real) o "Como otros han señalado"
Anthon