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/nulltira la salida habitual--silenttira el medidor de progreso--headrealiza 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/\ral 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_outpará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.csvSimplemente 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-responseLo que no dicen
--server-responsees 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
awkpara extraer el código de estado HTTP. Ese código es:$2) grupo de caracteres que no está en blanco:{$2}NR==1Y 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
curlpara 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 200fuente
-Ibandera 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
grepel 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
xargsriesgos mezclados), usaría GNU Parallel en lugar dexargsparalelizar:cat url.lst | parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfileEn este caso particular, puede ser seguro de usar
xargsporque la salida es muy corta, por lo que el problema con el usoxargses 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 reemplazarlocurlcon otra cosa, entonces tampoco es seguro.fuente