それでも機能するかどうかを確認するために確認する必要のあるURLのリストがあります。それを行うbashスクリプトを書きたいと思います。
返されたHTTPステータスコード、つまり200、404、500などだけが必要です。これ以上何もない。
編集ページに「404notfound」と表示されているが、200OKメッセージが返される場合は問題があることに注意してください。これは誤って構成されたWebサーバーですが、このケースを考慮する必要がある場合があります。
それでも機能するかどうかを確認するために確認する必要のあるURLのリストがあります。それを行うbashスクリプトを書きたいと思います。
返されたHTTPステータスコード、つまり200、404、500などだけが必要です。これ以上何もない。
編集ページに「404notfound」と表示されているが、200OKメッセージが返される場合は問題があることに注意してください。これは誤って構成されたWebサーバーですが、このケースを考慮する必要がある場合があります。
回答:
Curlには、次の特定のオプションがあります--write-out
。
$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
-o /dev/null
通常の出力を破棄します--silent
プログレスメーターを捨てる--head
GETの代わりにHEADHTTPリクエストを作成します--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ごとに1つのカールプロセスを使用することに気付くでしょう。これにより、フォークとTCP接続のペナルティが課せられます。1つのカールに複数のURLを組み合わせると高速になりますが、怪物の繰り返しを書き出すスペースがありません。カールがこれを行うために必要なオプションの。)
http://example.com/\r
ループを通過するとき
wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
ステータスコードのみを出力します
フィルによってすでに提供された答えを拡張します。呼び出しにxargsを使用する場合、並列処理を追加するのは簡単です。
ここにコードがあります:
xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst
-n1 :(リストからの)1つの値のみを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ファイルに出力するだけで、Officeツールにインポートできます。
これは、wget
Alpine Linuxでも、ほとんどどこにでも存在する、広く利用可能なものに依存しています。
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)に出力されるため、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
フラグにより、curlはHTTP HEADリクエストを作成します。これは、一部のサーバーでは通常のHTTP GETとは別に扱われるため、異なる値を返す可能性があります。コマンドはそれがなくても機能するはずです。
私はPythonで書かれたツール「webchk」を発見しました。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が平行ではなく、使用するxargs
並列化します:
cat url.lst |
parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile
この特定のケースではxargs
、出力が非常に短いため安全に使用できる可能性があります。したがって、使用の問題xargs
は、後で誰かがコードを変更してより大きなことを行うと、安全でなくなることです。または、誰かがこの質問を読んで、curl
他のものに置き換えることができると思った場合、それも安全ではない可能性があります。