Mam listę adresów URL, które muszę sprawdzić, aby sprawdzić, czy nadal działają, czy nie. Chciałbym napisać skrypt basha, który zrobi to za mnie.
Potrzebuję tylko zwróconego kodu stanu HTTP, tj. 200, 404, 500 i tak dalej. Nic więcej.
EDYTUJ Zwróć uwagę, że występuje problem, jeśli strona zawiera komunikat „404 nie znaleziono”, ale zwraca komunikat 200 OK. To źle skonfigurowany serwer internetowy, ale być może będziesz musiał rozważyć ten przypadek.
Aby uzyskać więcej informacji, zobacz Sprawdzanie, czy adres URL prowadzi do strony zawierającej tekst „404”
bash
curl
http-status-codes
Manu
źródło
źródło
Odpowiedzi:
Curl ma specjalną opcję
--write-out
, w tym:$ 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
wysyła żądanie HEAD HTTP zamiast GET--write-out '%{http_code}\n'
drukuje wymagany kod stanuAby to zakończyć w pełnym skrypcie Bash:
#!/bin/bash while read LINE; do curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE" done < url-list.txt
(Czytelnicy o orlich oczach zauważą, że wykorzystuje to jeden proces zwijania na adres URL, co nakłada kary za rozwidlenie i połączenia TCP. Byłoby szybciej, gdyby wiele adresów URL zostało połączonych w jednym zawinięciu, ale nie ma miejsca na zapisanie potwornego powtórzenia opcji wymaganych do zrobienia tego przez curl).
źródło
http://example.com/\r
podczas przechodzenia przez pętlęwget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
drukuje tylko kod stanu
źródło
Rozszerzenie odpowiedzi udzielonej już przez Phila. Dodanie do tego równoległości jest nie do pomyślenia 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 wywołania curl
-P10 : Utrzymaj przy życiu 10 procesów zwijania w dowolnym momencie (tj. 10 równoległych połączeń)
Sprawdź
write_out
parametr w instrukcji curl, aby uzyskać więcej danych, które możesz wyodrębnić za jego pomocą (czasy itp.).Na wypadek, gdyby komuś to pomogło, to jest połączenie, którego obecnie używam:
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 umieszcza zbiór danych w pliku csv, który można zaimportować do dowolnego narzędzia biurowego.
źródło
Opiera się to na szeroko dostępnym
wget
, obecnym prawie wszędzie, nawet w Alpine Linux.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
Objaśnienia są następujące:
--quiet
--spider
--server-response
Nie mówią o
--server-response
tym, że te nagłówki są drukowane do standardowego błędu (sterr) , stąd potrzeba przekierowania do stdin.Dane wyjściowe wysyłane na standardowe wejście możemy przesłać potokiem,
awk
aby wyodrębnić kod stanu HTTP. Ten kod to:$2
) niepusta grupa znaków:{$2}
NR==1
A ponieważ chcemy, aby go wydrukować ...
{print $2}
.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
źródło
2>&1 | head -1 | awk '{ print $2 }'
Użyj,
curl
aby pobrać tylko nagłówek HTTP (nie cały plik) i przeanalizować go:$ curl -I --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2 200
źródło
-I
przyczyny flag zwijać, aby złożyć zamówienie HEAD HTTP, który jest traktowany oddzielnie od normalnego HTTP GET przez niektóre serwery i może w ten sposób zwracać różne wartości. Polecenie powinno nadal działać bez niego.wget -S -i *file*
dostanie nagłówki z każdego adresu URL w pliku.Przefiltruj jednak specjalnie
grep
dla kodu stanu.źródło
Znalazłem narzędzie „webchk” napisane w Pythonie. Zwraca kod stanu dla listy adresów URL. Https://pypi.org/project/webchk/
Wynik wygląda następująco:
▶ 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)
Mam nadzieję, że to pomoże!
źródło
Ze względu na https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P (dane wyjściowe z równoległych zadań
xargs
przy mieszanym ryzyku), użyłbym GNU Parallel zamiastxargs
równolegle:cat url.lst | parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile
W tym konkretnym przypadku użycie może być bezpieczne,
xargs
ponieważ dane wyjściowe są tak krótkie, więc problem z użyciemxargs
polega raczej na tym, że jeśli ktoś później zmieni kod na coś większego, nie będzie to już bezpieczne. Lub jeśli ktoś czyta to pytanie i uważa, że może zastąpićcurl
coś innym, to również może nie być bezpieczne.źródło