Скрипт для получения HTTP-кода состояния списка URL-адресов?
У меня есть список URL-адресов, которые мне нужно проверить, чтобы увидеть, работают ли они по-прежнему или нет. Я хотел бы написать сценарий bash, который делает это для меня.
Мне нужен только возвращенный код состояния HTTP, то есть 200, 404, 500 и так далее. Ничего более.
РЕДАКТИРОВАТЬ Обратите внимание, что существует проблема, если на странице написано "404 не найден", но возвращает сообщение 200 OK. Это неправильно настроенный веб-сервер, но вам, возможно, придется рассмотреть этот случай.
Подробнее об этом см. В разделе " Проверка перехода URL-адреса на страницу, содержащую текст" 404 "".
Ответы
Ответ 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
чем-то другим, то это также может быть небезопасно.