ইউআরএলগুলির তালিকার HTTP স্থিতি কোড পেতে স্ক্রিপ্ট?


89

আমার কাছে ইউআরএলএসের একটি তালিকা রয়েছে যা আমার চেক করা দরকার, তারা এখনও কাজ করে কি না তা দেখতে। আমি একটি বাশ স্ক্রিপ্ট লিখতে চাই যা আমার জন্য এটি করে।

আমার কেবলমাত্র ফিরে আসা এইচটিটিপি স্থিতি কোডের প্রয়োজন, যেমন 200, 404, 500 এবং আরও। বেশি কিছু না.

সম্পাদনা করুন নোট করুন যে পৃষ্ঠাটি "404 পাওয়া যায় নি" তবে 200 টি ঠিক আছে বার্তাটি দেয় তবে একটি সমস্যা রয়েছে। এটি একটি ভুল কনফিগার্ড ওয়েব সার্ভার, তবে আপনাকে এই ক্ষেত্রে বিবেচনা করতে হতে পারে।

এ সম্পর্কে আরও তথ্যের জন্য, URL "404" পাঠ্যযুক্ত কোনও পৃষ্ঠায় URL টি যায় কিনা তা দেখুন see


4
সত্য কথা বলতে গেলে, আমার স্ক্রিপ্টের "বাগ" কেবল তখনই যখন সার্ভারটি HTTP কোড 200 ফেরত দেয় তবে বডি পাঠ্যটি "404 পাওয়া যায় নি", যা একটি দুর্ব্যবহারকারী ওয়েবসারভার।
ফিল

4
প্রতিক্রিয়া কোডটি 200, 8 4040, 42 302 হলে উইজেটের প্রস্থান স্থিতি 0 হবে ... আপনি use ব্যবহার করতে পারেন? পূর্ববর্তী কমান্ডের প্রস্থান স্থিতি অ্যাক্সেস করতে ভেরিয়েবল।
কেসি ওয়াটসন

উত্তর:


198

কার্লের একটি নির্দিষ্ট বিকল্প রয়েছে --write-out, এর জন্য:

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
  • -o /dev/null স্বাভাবিক আউটপুট দূরে নিক্ষেপ
  • --silent অগ্রগতি মিটার দূরে নিক্ষেপ
  • --head জেটের পরিবর্তে একটি হেড এইচটিটিপি অনুরোধ করে
  • --write-out '%{http_code}\n' প্রয়োজনীয় স্থিতি কোড মুদ্রণ করে

এটি একটি সম্পূর্ণ বাশ স্ক্রিপ্টে গুটিয়ে রাখতে:

#!/bin/bash
while read LINE; do
  curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < url-list.txt

(Agগল চোখের পাঠকরা লক্ষ্য করবেন যে এটি ইউআরএল প্রতি একটি কার্ল প্রক্রিয়া ব্যবহার করে, যা কাঁটাচামচ এবং টিসিপি সংযোগ জরিমানা আরোপ করে multiple একক কার্লে একাধিক ইউআরএল একত্রিত হলে এটি আরও দ্রুততর হবে, তবে দৈত্য পুনরাবৃত্তিটি লেখার মতো জায়গা নেই) বিকল্পগুলির জন্য যা কার্লকে এটি করতে হবে))


খুব সুন্দর. আমি কি আমার ফাইলের প্রতিটি url এ এই আদেশটি কার্যকর করতে পারি?
মানু

4
@ মনু: হ্যাঁ, কার্ল কমান্ড মোড়ানোর একটি সম্ভাব্য উপায় দেখানোর জন্য আমি আমার উত্তরটি সম্পাদনা করেছি। এটি ধরে নিয়েছে url-list.txt এ প্রতি লাইনটিতে একটি URL থাকে URL
ফিল

4
আমি জানি না কেন উপরের অ্যান্ডসওয়ার থেকে স্ক্রিপ্ট আমাকে সর্বদা আউটপুটে 000 করে দেয়, তবে যখন আমি লুপ ছাড়াই কেবল একবার কমান্ড চালাই তা কার্যকর হয় ...
কারোল এফ

4
@ ক্যারোলফিটারস্কি আমার একই সমস্যা ছিল (যা সম্ভবত আপনি স্থির করেছেন তবে অন্য কেউ যদি এই পথে হোঁচট খায় তবে ...) আমার ক্ষেত্রে আমার ইনপুট ফাইলের লাইন প্রান্তে গাড়ীর রিটার্ন ছিল, যার ফলে ইউআরএলগুলি এর মতো হতে পারে http://example.com/\rলুপ দিয়ে যাওয়ার সময়
জর্ডান রবিনসন

4
আমার এই সমস্যাটি ছিল এবং আমি উইন্ডোজ টাইপ থেকে লিনাক্স টাইপের সমাপ্ত লাইনটি স্যুইচ করে এটি ঠিক করতে সক্ষম হয়েছি।
ত্রিস্তান

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

আপনার জন্য কেবলমাত্র স্থিতি কোড মুদ্রণ করে


9
+1 এক url পুনঃনির্দেশিত করা হয়, প্রতিটি নতুন লাইনে।
আশফাম

আমি যে অনুরোধটি করার চেষ্টা করেছিলাম তার সাথে কাজ করার জন্য - স্পাইডারটি মুক্তি দিতে হয়েছিল তবে কাজ করে।
অমিতাভ

30

ফিল ইতিমধ্যে সরবরাহিত উত্তর বাড়ানো হচ্ছে। যদি আপনি কলটির জন্য এক্সার্গস ব্যবহার করেন তবে এটিতে প্যারালালিজম যুক্ত করা বাশের কোনও ব্রেইনার নয়।

এখানে কোড:

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

-n1 : কার্ল কলের আর্গুমেন্ট হিসাবে কেবলমাত্র একটি মান (তালিকা থেকে) ব্যবহার করুন

-পি 10: যে কোনও সময়ে 10 কার্ল প্রক্রিয়া জীবিত রাখুন (অর্থাত্ 10 সমান্তরাল সংযোগ)

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 ফাইলে একগুচ্ছ ডেটা আউটপুট দেয় যা কোনও অফিস সরঞ্জামে আমদানি করা যায়।


4
সমান্তরালতা, ফাইল ইনপুট এবং সিএসভি। ঠিক আমি খুঁজছেন ছিল কি।
এজি

উজ্জ্বল, আমার দিন তৈরি।
xlttj

এটি দুর্দান্ত, আমি যা খুঁজছিলাম, ধন্যবাদ স্যার। একটি প্রশ্ন, কীভাবে সিএসভি ফলাফলের মধ্যে পৃষ্ঠার পৃষ্ঠার শিরোনাম অন্তর্ভুক্ত করা যায়?
মিচেলকে

@estani - stackoverflow.com/users/1182464/estani কিভাবে এক .csv ফাইলে একটি পৃষ্ঠার শিরোনামটি পেয়ে অন্তর্ভুক্ত হতে পারে। পুনঃ পোস্ট করার জন্য দুঃখিত, আপনাকে ট্যাগ করতে ভুলে গেছি যাতে আপনি এই প্রশ্ন সম্পর্কে অবহিত হবেন। অনেক ধন্যবাদ.
মিচেলকে

@ মিচেলকে এটি HTTP কলের বিষয়বস্তু হ্যান্ডেল করছে না। যদি "পৃষ্ঠার শিরোনাম" (যা কিছু থাকে) url এ থাকে তবে আপনি এটি যুক্ত করতে পারেন। যদি তা না হয় তবে এর "শিরোনাম" বের করার জন্য আপনাকে পুরো পৃষ্ঠাটি বিশ্লেষণ করতে হবে (ধরে নিচ্ছেন যে আপনি এইচটিএমএল পৃষ্ঠার অর্থ এইচটিপিএল দ্বারা পুনরুদ্ধার করেছেন)। স্ট্যাক ওভারফ্লোতে অন্যান্য উত্তরগুলি সন্ধান করুন বা সেই নির্দিষ্ট প্রশ্নটি জিজ্ঞাসা করুন।
ইস্তানী

17

এটি ব্যাপকভাবে উপলভ্য wget, প্রায় সর্বত্র উপস্থিত, এমনকি আলপাইন লিনাক্সের উপর নির্ভর করে ।

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

ব্যাখ্যাগুলি নিম্নরূপ:

--quiet

উইজেটের আউটপুট বন্ধ করুন।

উত্স - উইজেট ম্যান পেজ

--spider

[...] এটি পৃষ্ঠাগুলি ডাউনলোড করবে না, কেবল সেখানে আছে কিনা তা পরীক্ষা করে দেখুন। [...]

উত্স - উইজেট ম্যান পেজ

--server-response

এইচটিটিপি সার্ভারের মাধ্যমে প্রেরিত শিরোনাম এবং এফটিপি সার্ভারগুলির দ্বারা প্রেরিত প্রতিক্রিয়াগুলি মুদ্রণ করুন।

উত্স - উইজেট ম্যান পেজ

তারা যা বলে না তা --server-responseহ'ল এই শিরোনামগুলির আউটপুটটি স্ট্যান্ডার্ড ত্রুটিতে (স্টেরার) মুদ্রিত হয় , সুতরাং স্টিডিনে পুনর্নির্দেশ করা প্রয়োজন ।

স্ট্যান্ডার্ড ইনপুটটিতে আউটপুট প্রেরণ করা হয়েছে, আমরা awkHTTP স্থিতি কোডটি বের করতে এটি পাইপ করতে পারি । এই কোডটি হ'ল:

  • দ্বিতীয় ( $2) অক্ষরের খালি দল:{$2}
  • শিরোনামের প্রথম লাইনে: NR==1

আর কারণ আমরা তা মুদ্রণ করতে চান ... {print $2}

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

4
আমি এটি দিয়ে ব্যবহার করেছি2>&1 | head -1 | awk '{ print $2 }'
Evhz

7

ব্যবহার করুন curlHTTP- র হেডার শুধুমাত্র (না পুরো ফাইল) আনা এবং এটি বিশ্লেষণ করতে:

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

কার্ল আমাকে 200 বলেন যখন উইজেট 404 ... :(
মনু

-Iপতাকা কারণ একটি HTTP মস্তক অনুরোধ, যা কিছু সার্ভার দ্বারা একটি স্বাভাবিক HTTP গেট থেকে আলাদাভাবে চিকিত্সা করা হয় এবং এইভাবে মান আলাদা আসতে পারেন করতে কার্ল। কমান্ডটি এখনও এটি ছাড়া কাজ করা উচিত।
lambshaanxy

4

wget -S -i *file* একটি ফাইলের প্রতিটি url থেকে শিরোনাম পাবেন।

grepবিশেষত স্ট্যাটাস কোডের জন্য ফিল্টার করুন ।


1

পাইথনে লেখা একটি সরঞ্জাম "ওয়েবচেক" পেয়েছি ur ইউআরএলগুলির তালিকার জন্য একটি স্থিতির কোডটি ফেরত দেয় htt 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)

আশা করি এইটি কাজ করবে!


0

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অন্য কোনও কিছু দিয়ে প্রতিস্থাপন করতে পারে তবে তাও নিরাপদ নাও হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.