Подтвердить что ты не робот

Скрипт для получения HTTP-кода состояния списка URL-адресов?

У меня есть список URL-адресов, которые мне нужно проверить, чтобы увидеть, работают ли они по-прежнему или нет. Я хотел бы написать сценарий bash, который делает это для меня.

Мне нужен только возвращенный код состояния HTTP, то есть 200, 404, 500 и так далее. Ничего более.

РЕДАКТИРОВАТЬ Обратите внимание, что существует проблема, если на странице написано "404 не найден", но возвращает сообщение 200 OK. Это неправильно настроенный веб-сервер, но вам, возможно, придется рассмотреть этот случай.

Подробнее об этом см. В разделе " Проверка перехода URL-адреса на страницу, содержащую текст" 404 "".

4b9b3361

Ответ 1

У Curl есть специальная опция, --write-out, для этого:

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
  • -o/dev/null выбрасывает обычный вывод
  • --silent выбрасывает индикатор прогресса
  • --head делает HTTP-запрос HEAD вместо GET
  • --write-out '%{http_code}\n' печатает необходимый код состояния

Чтобы обернуть это в полный скрипт Bash:

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

(Внимательные читатели заметят, что при этом используется один процесс скручивания для каждого URL, что накладывает штрафы на разветвление и TCP-соединение. Было бы быстрее, если бы несколько URL были объединены в один скручивание, но не было места для записи чудовищного повторения опций, которые curl требует для этого.)

Ответ 2

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

выводит только код состояния для вас

Ответ 3

Расширение ответа, уже предоставленного Филом. Добавление parallelism к нему не имеет смысла в bash, если вы используете xargs для вызова.

Здесь код:

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

-n1: используйте только одно значение (из списка) в качестве аргумента для вызова curl

-P10: Сохранять 10 процессов завивки в любое время (например, 10 параллельных соединений)

Проверьте параметр write_out в руководстве curl для получения дополнительных данных, которые вы можете извлечь из него (раз и т.д.).

В случае, если это помогает кому-то, это вызов, который я использую сейчас:

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

Он просто выводит кучу данных в файл csv, который можно импортировать в любой офисный инструмент.

Ответ 4

Это основано на широко доступном wget, представленном практически везде, даже в Alpine Linux.

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'

Ниже приведены объяснения:

--quiet

Отключить вывод Wget.

Источник - страницы руководства wget

--spider

[...] он не будет загружать страницы, просто проверьте, что они есть. [...]

Источник - страницы руководства wget

--server-response

Напечатайте заголовки, отправленные серверами HTTP, и ответы, отправленные серверами FTP.

Источник - страницы руководства wget

Что они не говорят о --server-response, так это о том, что вывод этих заголовков печатается с стандартной ошибкой (sterr), поэтому необходимо перенаправить на стандартный ввод.

Вывод отправляется на стандартный ввод, мы можем направить его на awk, чтобы извлечь код состояния HTTP. Этот код:

  • вторая ($2) непустая группа символов: {$2}
  • в самой первой строке заголовка: NR==1

И потому что мы хотим напечатать это... {print $2}.

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'

Ответ 5

Используйте curl, чтобы получить только HTTP-заголовок (не весь файл) и проанализировать его:

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

Ответ 6

wget -S -i *file* предоставит вам заголовки с каждого URL-адреса в файле.

Отфильтруйте хотя бы grep для кода состояния.

Ответ 7

Из-за https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P (выход из параллельных заданий в xargs рискует быть смешанным), я бы использовал GNU Parallel вместо xargs для распараллеливания:

cat url.lst |
  parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile

В этом конкретном случае может быть безопасно использовать xargs, потому что вывод очень короткий, поэтому проблема с использованием xargs скорее состоит в том, что если кто-то позже изменит код, чтобы сделать что-то большее, он больше не будет безопасный. Или, если кто-то читает этот вопрос и думает, что он может заменить curl чем-то другим, то это также может быть небезопасно.