cURL ابزاری قوی برای خطایابی
cURL مخفف Client for URLs و دستوری است که از آن برای انتقال دادهها از راه پروتکلهای گوناگون استفاده میشود. این ابزار را طیف وسیعی از دستگاهها پشتیبانی میکنند و میتوان از آن بهمنظور بررسی موارد متعددی همچون گزینههای زیر استفاده کرد:
- پشتیبانی از Proxy
- ارتباطات SSL
- عملکرد HTTP/HTTPS
- هدرهای HTTP و…
پروتکلهایی که این ابزار از آنها پشتیبانی میکند عبارتاند از: DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET و TFTP.
در این مطلب سعی شده تا نمونههایی از رایجترین روشهای استفاده از این ابزار بررسی شود.
نصب cURL روی ویندوز
اگر دستگاهی که برای خطایابی یا آزمایش این ابزار از آن استفاده میکنید، مبتنیبر سیستمعامل Linux/Unix نباشد، ابتدا نیاز است تا این ابزار را نصب کنید چراکه بهطور پیشفرض این ابزار در خط فرمان ویندوز وجود ندارد.
برای نصب این ابزار روی ویندوز، نیاز است تا پکیج مربوطه را از نشانی: https://curl.haxx.se/dlwiz/ دانلود کنید.
مراحل دانلود فایل از این نشانی در زیر آمده است:
- در قسمت Select Type of Package، روی curl executable کلیک کنید.
- در این صفحه در بخش Select Operating System، بر طبق نسخهی سیستمعامل خود، یکی از گزینههای Windows / Win32 یا Win64 را انتخاب و روی Select کلیک کنید.
- در این صفحه در بخش: Select for What Flavour، گزینهی Generic را انتخاب و روی Select کلیک کنید.
- در این صفحه نسخهای از cURL را که میخواهید، انتخاب و دانلود کنید.
نمونههایی از کاربردهای عمومی cURL
تمام دستوراتی که در نمونههای این مطلب گفته میشوند را میتوانید بهشکل مستقیم در ترمینال وارد کنید.
- HTTP GET Request
یکی از سادهترین کاربردهای دستور curl، استفاده از آن برای ارسال یک HTTP GET Request درازای نشانی یک وبسایت (یا یک URL خاص) است.
curl [http or https]://www.example.com
پس از اجرای این دستور در خروجی، HTTP Response دریافتی از URL مورد پرسش، نشان داده خواهد شد.
- بازیابی تنهای HTTP Header برای یک URL خاص
با استفاده از گزینهی –I در دستور curl میتوان در خروجی این دستور تنها HTTP headerهای (HEAD method) یک URL خاص را مشاهده کرد:
curl –I [http or https]://www.example.com
نکته: در هنگام debug رفتار CDN با استفاده از دستور curl، از گزینهی –I استفاده نکنید، چراکه این گزینه سبب ارسال یک HEAD request میشود. کاربران معمولن GET Request ارسال میکنند و نه HEAD Request و رفتار CDN با HEAD Requestها متفاوت از GET Requestهاست، در نتیجه ممکن است در خروجی دستور، نتایجی مشاهده کنید که بیمعنی هستند.
همواره برای debug رفتار CDN، از گزینهی –svo (که گزینهی s بیانگر حالت silent mode است و سبب میشود در خروجی پیامهای خطا نشان داده نشوند) در دستور curl استفاده کنید.
- ذخیرهی خروجی حاصل از دستور curl
با استفاده از گزینههای –o و –O در دستور curl میتوان خروجی حاصل از این دستور را بهشکل فایلی ذخیره کرد. تفاوت این دو گزینه در آن است که با –o فایل خروجی با نامی که خود تعیین میکنیم، ذخیره میشود اما با استفاده از –O فایل خروجی با همان نامی که دارد، ذخیره میشود:
curl –o [file name ex: myfile.css] [http or https]://cdn.arvancloud.com/css/example.css
curl –O [http or https]://cdn.arvancloud.com/css/example.css
- دستکاری خروجی دستور curl
گاهی نیاز است تا تنها بخشی از اطلاعات را در خروجی دستور curl در قبال یک URL مشاهده کرد و میتوان در این دستور از گزینهی grep (یا egrep) استفاده کرد:
curl -o /dev/null http://example.com/img/test.jpg 2>&1 | grep "CF-"
در دستور بالا، عبارت 2>&1 بیانگر هدایت stderr (standard error) به stdout (standard output) است.
- افزودن HTTP Header اضافی
با استفاده از گزینهی –H (یا –header) در دستور curl میتوان، هدر HTTP اضافهتری به درخواست GET افزود. این گزینه میتواند برای ارسال request headerهای خاص چون: HOST، Set-Cookie یا حتا یک هدر سفارشی در هنگام تست APIها استفاده شود:
curl –H "HEADER: VALUE" [http or https]://www.example.com
نکته: با عدم مشخص کردن Value در دستور بالا، پس از مشخص کردن نامِ هدرِ مورد نظر باید از semi-colon (;) استفاده کرد.
- تنظیم نشانی سفارشی برای یک URL
با استفاده از گزینهی –-resolve در دستور curl، برای این دستور مشخص میکنیم که URL گفته شده در دستور را بهجای DNS یا فایل /etc/hosts، از نشانی تعیینشده درخواست کند:
curl --resolve hostname:port:DESTINATIONIPADDRESS http(s)://www.example.com
- دریافت اطلاعات بیشتر
گاهی نیاز است تا جزییات بیشتری در رابطه با یک request را مشاهده کرد، همچون request headerهای ارسال شده و فرآیند برقراری ارتباط، برای این منظور میتوان از گزینهی –v (یا –verbose) در دستور curl استفاده کرد:
curl -v https://www.example.com/
- ذخیرهی هدرهای HTTP
با استفاده از گزینهی –D (یا –dump-header) میتوان هدرهای دریافتی از URL مورد پرسش را ذخیره کرد. برای نمونه با استفاده از این گزینه میتوان ابتدا هدرها را ذخیره کرد، سپس با استفاده از گزینهی –b (یا cookie—) از هدرهای ذخیره شد، cookieها را خواند.
curl –D - https://www.example.com/
در دستور بالا، – بهتنهایی بیانگر، ذخیرهی فایل در stdout است؛ مکانی که کرنل خروجیها را آنجا ذخیره میکند که معمولن همان ترمینالی است که دستور در آن اجرا میشود.
- GET Method
در HTTP از GET بهمنظور بازیابی منابع یک URL خاص استفاده میشود. در حالت معمول، با استفاده از دستور curl و درج تنها یک URL در این دستور، برای دریافت اطلاعات مربوط به URL مورد پرسش از روش GET استفاده میشود اما با این حال میتوان با استفاده از گزینهی: –request GET (یا –X GET) صراحتن نوع روش مورد استفادهی HTTP را، روش GET تعیین کرد:
curl --request GET https://www.example.com/
- POST Method
از روش POST بهمنظور ارسال اطلاعات به وبسرور استفاده میشود. برای مشخص کردن این روش در هنگام کار با دستور curl میتوان از گزینهی –-request POST (یا –X POST) استفاده کرد:
curl --request POST https://www.example.com/
- PUT Method
با استفاده از روش PUT، منبعی براساس دادههای ارسالی از جانب کاربر به سرور، ایجاد یا بهروزرسانی میشود همانند حالتی که یک صفحهی وب جدید برای وبسایت ایجاد یا یک صفحهی موجود، بهروزرسانی میشود. با استفاده از گزینهی: –request PUT (یا –X PUT) در دستور curl میتوان استفاده از این روش را مشخص کرد:
curl --request PUT https://www.example.com/
- DELETE Method
با استفاده از روش DELETE میتوان منبعی مربوط به یک URL خاص را از وبسرور حذف کرد. برای استفاده از این روش با دستور curl میتوانید از گزینهی: –request DELETE (یا –X DELETE) استفاده کنید:
curl --request DELETE https://www.example.com
- استفاده از curl برای ارسال داده
با استفاده از گزینهی –d (یا –data) در دستور curl میتوان دادهی خاصی همچون: اطلاعات login با کمک روش POST همانند آنچه در نمونهی زیر نشان داده شده را برای سرور ارسال کرد:
curl -X POST http://www.example.com/login/ -d 'username=yourusername&password=yourpassword'
- ازسرگیری دانلود یک فایل
اگر در حین دانلود یک فایل/منبع، فرآیند دانلود بنا به هر دلیلی متوقف شود، میتوان با استفاده از گزینهی –C این فرآیند را دوباره از سر گرفت:
curl -C - -O https://cdn.arvancloud.com/img/example.png
- تست زمان دانلود بدون دریافت یک فایل
اگر نیاز به ذخیرهی یک خروجی نباشد، برای نمونه هنگامیکه هدف، تنها تست سرعت دانلود بدون دریافت یک فایل باشد، میتوان در دستور curl از گزینهی /dev/null استفاده کرد:
curl -o https://www.example.com /dev/null
- مشخص کردن Maximum Transfer Rate
با استفاده از گزینهی –-limit-rate میتوان بیشترین نرخ انتقال (Maximum Transfer Rate) را برای هر دوی اعمال دانلود و آپلود، مشخص کرد. بهشکل پیشفرض این نرخ برحسب بایت بر ثانیه اندازهگیری میشود. برای تغییر این رفتار پیشفرض میتوان پس از عدد مورد نظر از حروف K (کیلوبایت)، M (مگابایت) یا G (گیگابایت) استفاده کرد:
curl --limit-rate 200K -O https://cdn.arvancloud.com/img/test.png
- بررسی پشتیبانی از HTTP/2
اگر از آخرین نسخه cURL استفاده کنید، میتوانید با استفاده از گزینهی –-http2 از پشتیبانی URL مورد نظر خود از HTTP/2 آگاه شوید. اگر پس از اجرای این دستور، در خروجی بهجای HTTP/1.1 200، HTTP/2 200 بیاید، بهمنزلهی پشتیبانی آن وبسایت از HTTP/2 است:
curl -I --http2 https://www.example.com/
- بازیابی بخشی از یک فایل
با استفاده از گزینهی –r در دستور curl میتوان بخش خاصی از یک فایل را بازیابی کرد. برای بازیابی این بخش خاص، باید آن را در قالب بازهای به بایت، همانند: 0-499 مشخص کرد:
curl -r 0-20000 -o test.png https://cdn.arvancloud.com/img/cdn-stats.png
- اجرای دستور curl با user-agent string خاص
گاهی وبسرور یا اپلیکیشن وبی که دستور curl بهسمت آن ارسال میشود قوانینی دارد که از پذیرش curl user-agent string پیشفرض خودداری میکند. در این موقعیت میتوان با استفاده از گزینهی –-user-agent در دستور curl، نوع user-agent string را تعیین کرد:
curl --user-agent "USERAGENTSTRING"
منظور از user-agent string، HTTP Request Header است که user agent (مثلن مرورگر) برای وبسرور ارسال میکند و حاوی اطلاعاتی چون سیستمعامل مورد استفاده، نسخهی مرورگر و… است.
- راهنما
با کمک گزینهی –h میتوان فهرستی از گزینههای مختلف برای بهکارگیری در دستور curl و توضیحی در رابطه با هریک از این دستورات را مشاهده کرد:
curl -h
اشکالزدایی خطاهای HTTP
گاهی در هنگام خطایابی مشکلات HTTP نیاز است تا بهشکل مستقیم، سرور اصلیِ میزبان سایت مورد پرسش قرار گیرد. برای انجام این عمل نیاز است تا ابتدا از نشانی IP سرور اصلی میزبان سایت، اطلاع داشته باشید. با عدم اطلاع از این نشانی، میتوانید آن را در بخش تنظیمات DNS پنل کاربری آروان و نگاهی به DNS recordهای ثبت شده برای دامنهی خود، بیابید. سپس با استفاده از گزینههای –-header یا –-resolve در دستور curl، میتوانید درخواست را بهشکل مستقیم برای سرور اصلی ارسال کنید:
curl -svo /dev/null --header "Host: example.com" http://ServerIPAddress/
curl -svo /dev/null --resolve example.com:80:ServerIPAddress http://example.com/
خطایابی عملکرد
- دستور time
با استفاده از cURL میتوان میزان تاخیر و ضعف در عملکرد را برای درخواستهای HTTP/HTTPS، سنجید. یک روش ساده برای انجام این عمل استفاده از دستور time با دستور curl است. استفاده از این دو دستور بهشکل همزمان، نشاندهندهی کل زمان مورد نیاز برای تکمیل یک درخواست است:
time curl -svo /dev/null http://example.com/
- گزینهی –w یا -–write-out
با استفاده از این گزینه میتوان متغیرهای مختلفی را برای تست عملکرد، در دستور curl مشخص کرد.
فهرست کاملی از این متغیرها را میتوانید با مراجعه به curl.haxx.se پیدا کنید.
در زیر نمونهای از چگونگی بهکارگیری این گزینه در دستور curl نشان داده شده است (برای نشان داده شدن نتایج حاصل از هر متغیر در یک خط مجزا و وضوح بیشتر خروجیِ حاصل از اجرای این دستور، پیش از هر متغیر از /n استفاده شده است):
curl -svo /dev/null https://example.com/ -w "\nContent Type: %{content_type} \
\nHTTP Code: %{http_code} \
\nHTTP Connect:%{http_connect} \
\nNumber Connects: %{num_connects} \
\nNumber Redirects: %{num_redirects} \
\nRedirect URL: %{redirect_url} \
\nSize Download: %{size_download} \
\nSize Upload: %{size_upload} \
\nSSL Verify: %{ssl_verify_result} \
\nTime Handshake: %{time_appconnect} \
\nTime Connect: %{time_connect} \
\nName Lookup Time: %{time_namelookup} \
\nTime Pretransfer: %{time_pretransfer} \
\nTime Redirect: %{time_redirect} \
\nTime Start Transfer: %{time_starttransfer} \
\nTime Total: %{time_total} \
\nEffective URL: %{url_effective}\n" 2>&1
استفاده از cURL برای خطایابی SSL/TLS
از cURL میتوان بهمنظور بررسی گواهی SSL/TLS نیز استفاده کرد.
برای نمونه، با استفاده از دستور زیر میتوان اطلاعات مفیدی در رابطه با TLS handshake و اطلاعات مربوط به گواهی SSL/TLS یک URL خاص بهدست آورد:
curl -svo /dev/null https://www.example.com/ 2>&1 | egrep -v “^{.*$|^}.*$|^\* http.*$”
همچنین برای بررسی گواهی SSL/TLS مربوط به سرور اصلی میزبان سایت، میتوان در دستور بالا از گزینهی –-resolve استفاده کرد.
- تست نسخه TLS
اگر نیاز به بررسی پشتیبانی وبسایت از یک نسخهی خاص از TLS باشد، میتوان در دستور curl نسخهی TLS مورد نظر را مشخص کرد.
نسخههایی که میتوانند در این دستور مشخص شوند، عبارتاند از:
- –tlsv1.0
- –tlsv1.1
- –tlsv1.2
- –tlsv1.3
در زیر نمونهای از بهکارگیری یکی از این گزینهها در دستور curl نشان داده شده است:
curl -svo /dev/null –tls1.2 https://www.example.com/ 2>&1 | egrep -v “^{.*$|^}.*$|^\
من از این ابزار برای ریبوت کردن دوربین هایک ویژن بدون دسترسی فیزیکی به دوربین و وب دوربین استفاده کردم
منبع : ابرآروان