Tengo una lista de URL que necesito comprobar para ver si todavía funcionan o no. Me gustaría escribir un script bash que lo haga por mí.
Solo necesito el código de estado HTTP devuelto, es decir, 200, 404, 500 y así sucesivamente. Nada mas.
EDITAR Tenga en cuenta que hay un problema si la página dice "404 no encontrado" pero devuelve un mensaje 200 OK. Es un servidor web mal configurado, pero es posible que deba considerar este caso.
Para obtener más información sobre esto, consulte Comprobar si una URL va a una página que contiene el texto "404".
bash
curl
http-status-codes
Manu
fuente
fuente
Respuestas:
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
realiza una solicitud HEAD HTTP, en lugar de GET--write-out '%{http_code}\n'
imprime el código de estado requeridoPara resumir esto en un script 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 con ojos de águila notarán que esto usa un proceso de rizo por URL, lo que impone penalizaciones de conexión TCP y de bifurcación. Sería más rápido si se combinaran varias URL en un solo rizo, pero no hay espacio para escribir la monstruosa repetición de opciones que curl requiere para hacer esto).
fuente
http://example.com/\r
al pasar por el circuitowget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
imprime solo el código de estado para usted
fuente
Ampliando la respuesta ya proporcionada por Phil. Agregar paralelismo es una obviedad 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 activos 10 procesos de rizo en cualquier momento (es decir, 10 conexiones en paralelo)
Consulte el
write_out
parámetro en el manual de curl para obtener más datos que pueda extraer usándolo (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.
fuente
Esto se basa en una amplia disponibilidad
wget
, presente en casi todas partes, incluso en Alpine Linux.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
Las explicaciones son las siguientes:
--quiet
--spider
--server-response
Lo que no dicen
--server-response
es que la salida de esos encabezados se imprime con un error estándar (sterr) , por lo que es necesario redirigir a stdin.La salida enviada a la entrada estándar, podemos canalizarla
awk
para extraer el código de estado HTTP. Ese código es:$2
) grupo de caracteres que no está en blanco:{$2}
NR==1
Y porque queremos imprimirlo ...
{print $2}
.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
fuente
2>&1 | head -1 | awk '{ print $2 }'
Úselo
curl
para buscar solo el encabezado HTTP (no el archivo completo) y analizarlo:$ curl -I --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2 200
fuente
-I
bandera hace que curl realice una solicitud HTTP HEAD, que algunos servidores tratan por separado de un HTTP GET normal y, por lo tanto, puede devolver valores diferentes. El comando aún debería funcionar sin él.wget -S -i *file*
obtendrá los encabezados de cada URL en un archivo.Filtre
grep
el código de estado específicamente.fuente
Encontré una herramienta "webchk" escrita en Python. Devuelve un código de estado para una lista de URL. Https://pypi.org/project/webchk/
La salida se ve así:
▶ webchk -i ./dxieu.txt | grep '200' http://salesforce-case-status.dxi.eu/login ... 200 OK (0.108) https://support.dxi.eu/hc/en-gb ... 200 OK (0.389) https://support.dxi.eu/hc/en-gb ... 200 OK (0.401)
¡Espero que ayude!
fuente
Debido a https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P (salida de trabajos paralelos con
xargs
riesgos mezclados), usaría GNU Parallel en lugar dexargs
paralelizar:cat url.lst | parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile
En este caso particular, puede ser seguro de usar
xargs
porque la salida es muy corta, por lo que el problema con el usoxargs
es más bien que si alguien más tarde cambia el código para hacer algo más grande, ya no será seguro. O si alguien lee esta pregunta y piensa que puede reemplazarlocurl
con otra cosa, entonces tampoco es seguro.fuente