У меня есть список URL-адресов, которые мне нужно проверить, чтобы узнать, работают ли они по-прежнему или нет. Я хотел бы написать сценарий bash, который сделает это за меня.
Мне нужен только возвращенный код состояния HTTP, например 200, 404, 500 и так далее. Ничего более.
ИЗМЕНИТЬ Обратите внимание, что возникает проблема, если на странице отображается сообщение «404 not found», но возвращается сообщение 200 OK. Это неправильно настроенный веб-сервер, но вам, возможно, придется рассмотреть этот случай.
Для получения дополнительной информации см. Проверка, ведет ли URL-адрес на страницу, содержащую текст «404».
Ответы:
У 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.)
источник
http://example.com/\r
при прохождении петлиwget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
печатает только код статуса для вас
источник
Расширение ответа, уже предоставленного Филом. Добавление к нему параллелизма в 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 процессов curl активными в любое время (т.е. 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, который можно импортировать в любой офисный инструмент.
источник
Это зависит от широко доступных
wget
, присутствующих почти везде, даже в Alpine Linux.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
Объяснения следующие:
--quiet
--spider
--server-response
О чем они не говорят, так это о
--server-response
том, что вывод этих заголовков печатается со стандартной ошибкой (sterr) , поэтому необходимо перенаправить на stdin.Вывод, отправленный на стандартный ввод, мы можем передать по конвейеру
awk
для извлечения кода состояния HTTP. Этот код:$2
) непустая группа символов:{$2}
NR==1
И потому , что мы хотим напечатать его ...
{print $2}
.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
источник
2>&1 | head -1 | awk '{ print $2 }'
Используйте
curl
для получения только HTTP-заголовка (а не всего файла) и его анализа:$ curl -I --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2 200
источник
-I
флаге причины свернуться , чтобы сделать запрос HTTP HEAD, который обрабатывается отдельно от нормального HTTP GET некоторых серверов и таким образом возвращать различные значения. Команда все равно должна работать без нее.wget -S -i *file*
даст вам заголовки с каждого URL-адреса в файле.Отфильтруйте только
grep
код состояния.источник
Я нашел инструмент «webchk», написанный на Python. Возвращает код состояния для списка URL-адресов. Https://pypi.org/project/webchk/
Результат выглядит так:
▶ 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)
Надеюсь, это поможет!
источник
Из-за 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
чем-то другим, это тоже может быть небезопасно.источник