skrypt, aby uzyskać kod statusu HTTP listy adresów URL?

Mam listę adresów URL, które muszę sprawdzić, czy nadal działają, czy nie. Chciałbym napisać skrypt bash, który robi to za mnie.

Potrzebuję tylko zwracanego kodu statusu HTTP, tj. 200, 404, 500 i tak dalej. Nic więcej.

EDIT zwróć uwagę, że wystąpił problem, jeśli strona mówi "404 not found", ale zwraca komunikat OK 200. Jest to źle skonfigurowany serwer WWW, ale być może będziesz musiał rozważyć tę sprawę.

Aby dowiedzieć się więcej na ten temat, zobacz sprawdź, czy adres URL trafia do strona zawierająca tekst "404"

Author: Community, 2011-05-26

5 answers

Curl ma określoną opcję, --write-out, dla tego:

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
  • -o /dev/null wyrzuca zwykłe wyjście
  • --silent wyrzuca miernik postępu
  • --head wykonuje HEAD HTTP request, zamiast GET
  • --write-out '%{http_code}\n' wyświetla wymagany kod statusu

Aby zawinąć to w kompletny skrypt Basha:

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

(czytelnicy z Eagle-eyed zauważą, że wykorzystuje to jeden proces curl na adres URL, co nakłada kary za połączenia fork i TCP. Byłoby szybciej, gdyby wiele adresów URL zostało połączonych w jednym curl, ale nie ma miejsca na wypisanie potwornego powtarzania opcji, których curl wymaga do tego.)

 156
Author: Phil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 23:44:44
wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'

Wyświetla tylko kod statusu dla ciebie

 32
Author: user551168,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-25 10:40:36

Rozszerzenie odpowiedzi już udzielonej przez Phila. Dodawanie do niego równoległości jest bezmyślne w bash, jeśli używasz xargs do wywołania.

Tutaj kod:

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

-n1 : użyj tylko jednej wartości (z listy) jako argumentu do wywołania curl

-P10 : utrzymuj 10 procesów zwijania w dowolnym momencie (tj. 10 połączeń równoległych)

Sprawdź parametr write_out w podręczniku curl, aby uzyskać więcej danych, które możesz wyodrębnić za jego pomocą (czasy, itp.).

Na wypadek, gdyby to pomogło ktoś to jest połączenie, z którego obecnie korzystam:

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

Po prostu wysyła kilka danych do pliku csv, który można zaimportować do dowolnego narzędzia biurowego.

 22
Author: estani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 13:20:22

Użycie curl Aby pobrać tylko nagłówek HTTP (nie cały plik) i przetworzyć go:

$ curl -I  --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2
200
 7
Author: dogbane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-26 09:25:07

wget -S -i *file* otrzymasz nagłówki z każdego adresu url w pliku.

Filtruj chociaż grep dla kodu statusu.

 4
Author: colinross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-26 09:10:06