Saya memiliki daftar URL yang perlu saya periksa, untuk melihat apakah masih berfungsi atau tidak. Saya ingin menulis skrip bash yang melakukannya untuk saya.
Saya hanya perlu kode status HTTP yang dikembalikan, yaitu 200, 404, 500, dan seterusnya. Tidak ada lagi.
EDIT Perhatikan bahwa ada masalah jika halaman mengatakan "404 tidak ditemukan" tetapi mengembalikan pesan 200 OK. Ini adalah server web yang salah dikonfigurasi, tetapi Anda mungkin harus mempertimbangkan kasus ini.
Untuk lebih lanjut tentang ini, lihat Periksa apakah URL menuju ke halaman yang berisi teks "404"
bash
curl
http-status-codes
Manu
sumber
sumber
Jawaban:
Curl memiliki opsi khusus
--write-out
, untuk ini:$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url> 200
-o /dev/null
membuang keluaran biasa--silent
membuang pengukur kemajuan--head
membuat permintaan HTTP HEAD, bukan GET--write-out '%{http_code}\n'
mencetak kode status yang diperlukanUntuk menyelesaikan ini dalam skrip Bash lengkap:
#!/bin/bash while read LINE; do curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE" done < url-list.txt
(Pembaca bermata elang akan melihat bahwa ini menggunakan satu proses curl per URL, yang memberlakukan hukuman fork dan koneksi TCP. Akan lebih cepat jika beberapa URL digabungkan dalam satu curl, tetapi tidak ada ruang untuk menulis pengulangan monsterous opsi yang diperlukan curl untuk melakukan ini.)
sumber
http://example.com/\r
saat melalui loopwget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
mencetak hanya kode status untuk Anda
sumber
Memperluas jawaban yang sudah diberikan oleh Phil. Menambahkan paralelisme ke dalamnya adalah hal yang mudah jika Anda menggunakan xargs untuk panggilan tersebut.
Berikut kodenya:
xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst
-n1 : gunakan hanya satu nilai (dari daftar) sebagai argumen untuk panggilan curl
-P10 : Jaga 10 proses curl tetap hidup setiap saat (yaitu 10 koneksi paralel)
Periksa
write_out
parameter di manual curl untuk mengetahui lebih banyak data yang dapat Anda ekstrak menggunakannya (waktu, dll).Jika itu membantu seseorang, inilah panggilan yang sedang saya gunakan:
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
Itu hanya mengeluarkan banyak data ke dalam file csv yang dapat diimpor ke alat kantor apa pun.
sumber
Ini bergantung pada ketersediaan luas
wget
, hadir hampir di mana-mana, bahkan di Alpine Linux.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
Penjelasannya sebagai berikut:
--quiet
--spider
--server-response
Apa yang tidak mereka katakan
--server-response
adalah bahwa output header tersebut dicetak ke kesalahan standar (sterr) , sehingga perlu dialihkan ke stdin.Output dikirim ke input standar, kita dapat menyalurkannya ke
awk
untuk mengekstrak kode status HTTP. Kode itu adalah:$2
kelompok karakter kedua ( ) tidak kosong:{$2}
NR==1
Dan karena kami ingin mencetaknya…
{print $2}
.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
sumber
2>&1 | head -1 | awk '{ print $2 }'
Gunakan
curl
untuk mengambil HTTP-header saja (bukan seluruh file) dan parsing:$ curl -I --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2 200
sumber
-I
penyebab bendera meringkuk untuk membuat permintaan HTTP HEAD, yang diperlakukan secara terpisah dari normal HTTP GET oleh beberapa server dan dengan demikian dapat kembali nilai-nilai yang berbeda. Perintah harus tetap berfungsi tanpanya.wget -S -i *file*
akan memberi Anda header dari setiap url dalam sebuah file.Filter meskipun
grep
untuk kode status secara khusus.sumber
Saya menemukan alat "webchk" yang ditulis dengan Python. Mengembalikan kode status untuk daftar url. Https://pypi.org/project/webchk/
Outputnya terlihat seperti ini:
▶ 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)
Semoga membantu!
sumber
Karena https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P (keluaran dari pekerjaan paralel dalam
xargs
risiko tercampur), saya akan menggunakan GNU Parallel alih-alihxargs
memparalelkan:cat url.lst | parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile
Dalam kasus khusus ini mungkin aman untuk digunakan
xargs
karena outputnya sangat pendek, jadi masalah dengan menggunakanxargs
adalah jika seseorang kemudian mengubah kode untuk melakukan sesuatu yang lebih besar, itu tidak akan aman lagi. Atau jika seseorang membaca pertanyaan ini dan berpikir dia dapat mengganticurl
dengan sesuatu yang lain, maka itu mungkin juga tidak aman.sumber