Скрипт для получения HTTP-кода состояния списка URL-адресов? - PullRequest
77 голосов
/ 26 мая 2011

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

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

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

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

Ответы [ 6 ]

175 голосов
/ 26 мая 2011

У 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

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

35 голосов
/ 25 февраля 2012
wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'

печатает только код состояния для вас

28 голосов
/ 13 марта 2014

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

Здесь код:

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

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

-P10 : поддерживать 10 процессов curl в любое время (т. е. 10 параллельных соединений)

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

В случае, если кому-то это поможет, это вызов, которым я пользуюсь в настоящее время:* Он просто выводит кучу данных в CSV-файл, который можно импортировать в любой офисный инструмент.

7 голосов
/ 26 мая 2011

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

$ curl -I  --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2
200
4 голосов
/ 18 ноября 2018

Это зависит от широко доступного 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}'
4 голосов
/ 26 мая 2011

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

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

...