subcadena - scripts bash ejemplos




secuencia de comandos para obtener el código de estado HTTP de una lista de URL? (4)

Tengo una lista de URL que debo verificar para ver si aún funcionan o no. Me gustaría escribir un script bash que haga eso por mí.

Solo necesito el código de estado HTTP devuelto, es decir, 200, 404, 500, etc. Nada mas.

EDITAR Tenga en cuenta que hay un problema si la página dice "404 no encontrado" pero devuelve un mensaje de 200 OK. Es un servidor web mal configurado, pero es posible que tenga que considerar este caso.

Para obtener más información al respecto, consulte Comprobar si una URL va a una página que contiene el texto "404"


Extendiendo la respuesta ya provista por Phil. Agregarle paralelismo es pan comido en bash si usa xargs para la llamada.

Aquí el código:

xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst

-n1 : use solo un valor (de la lista) como argumento para la llamada curl

-P10 : mantenga 10 procesos curl vivas en cualquier momento (es decir, 10 conexiones paralelas)

Compruebe el parámetro write_out en el manual de curl para obtener más información que puede extraer usando (tiempos, etc.).

En caso de que ayude a alguien, esta es la llamada que estoy usando actualmente:

xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective};%{http_code};%{time_total};%{time_namelookup};%{time_connect};%{size_download};%{speed_download}\n' < url.lst | tee results.csv

Simplemente genera una gran cantidad de datos en un archivo csv que se puede importar a cualquier herramienta de oficina.


Use curl para buscar solo el encabezado HTTP (no el archivo completo) y analícelo:

$ curl -I  --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2
200

Curl tiene una opción específica, - --write-out , para esto:

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
  • -o /dev/null tira la salida habitual
  • --silent tira el medidor de progreso
  • --head hace una solicitud HEAD HTTP, en lugar de GET
  • --write-out '%{http_code}\n' imprime el código de estado requerido

Para resumir esto en un guión Bash completo:

#!/bin/bash
while read LINE; do
  curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < url-list.txt

(Los lectores de Eagle observarán que esto utiliza un proceso curl por URL, que impone penalizaciones por conexión fork y TCP. Sería más rápido si se combinaran varias URL en un solo curl, pero no hay espacio para escribir la repetición monstruosa de opciones que curl requiere para hacer esto).


wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'

imprime solo el código de estado para usted





http-status-codes