web-dev-qa-db-ja.com

URLのリストのHTTPステータスコードを取得するスクリプト?

URLのリストがあり、それらがまだ機能するかどうかを確認する必要があります。私のためにそれを行うbashスクリプトを書きたいと思います。

返されるHTTPステータスコード(200、404、500など)のみが必要です。これ以上何もない。

EDITページに「404 not found」と表示されても200 OKメッセージが返される場合は問題があることに注意してください。これは、誤って設定されたWebサーバーですが、このケースを考慮する必要がある場合があります。

詳細については、 RLがテキスト「404」を含むページに移動するかどうかを確認する を参照してください。

81
Manu

Curlには、このための特定のオプション--write-outがあります。

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
  • -o /dev/nullは通常の出力を破棄します
  • --silentは進行状況メーターを破棄します
  • --headは、GETの代わりにHEAD HTTP要求を作成します
  • --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ごとに1つのcurlプロセスを使用することに気付くでしょう。これはforkとTCP接続ペナルティを課します。 curlがこれを行うために必要なオプションのモンスターの繰り返しを書き出すため)

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

状態コードのみを出力します

35
user551168

フィルが既に提供した答えを拡張します。呼び出しにxargsを使用する場合、並列処理を追加することはbashで簡単に行えます。

ここにコード:

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

-n1:curl呼び出しの引数として(リストから)1つの値のみを使用します

-P1:常に10個のcurlプロセスを存続させます(10個の並列接続)

Curlのマニュアルでwrite_outパラメーターを確認して、それを使用して抽出できるデータ(時刻など)を確認してください。

それが誰かを助ける場合、これは私が現在使用している電話です:

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ファイルに出力するだけで、任意のオフィスツールにインポートできます。

27
estani

これは、Alpine Linuxを含むほぼすべての場所に存在する、広く利用可能なwgetに依存しています。

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

説明は次のとおりです。

--quiet

Wgetの出力をオフにします。

ソース-wget manページ

--spider

[...]それはページをダウンロードせず、単にそれらが存在することを確認します。 [...]

ソース-wget manページ

--server-response

HTTPサーバーから送信されたヘッダーとFTPサーバーから送信された応答を印刷します。

ソース-wget manページ

彼らが--server-responseについて言っていないのは、それらのヘッダー出力が 標準エラー(sterr) に出力されるため、 redirect がstdinに必要であるということです。

出力を標準入力に送信し、awkにパイプしてHTTPステータスコードを抽出できます。そのコードは次のとおりです。

  • 2番目の($2)文字の非空白グループ:{$2}
  • ヘッダーの最初の行:NR==1

そして、それを印刷したいので... {print $2}

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

curl を使用して、HTTPヘッダーのみ(ファイル全体ではなく)をフェッチし、解析します。

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

wget -S -i *file*は、ファイル内の各URLからヘッダーを取得します。

ステータスコードのgrepをフィルタリングします。

4
colinross