ارسال درخواستهای HTTP بدون curl
ممکن است روی سروری کار کنید که curl یا wget در آن نصب نیست. نیاز دارید یک endpoint را تست کنید اما این ابزارها موجود نیستند. شما میتوانید از Bash برای ارسال مستقیم درخواستهای HTTP استفاده کنید.
Bash دارای یک قابلیت پنهان به نام /dev/tcp است. این یک فایل واقعی نیست، بلکه یک دستگاه (device) خاص است که Bash آن را میشناسد. وقتی در مسیر /dev/tcp/hostname/port چیزی مینویسید، Bash یک اتصال TCP برای شما باز میکند.
نحوه عملکرد:
شما از دستور exec برای مدیریت توصیفگرهای فایل (file descriptors) استفاده میکنید. برای مثال، میتوانید توصیفگر فایل شماره ۳ را برای خواندن و نوشتن باز کنید.
نحو (syntax) آن به این صورت است:
exec 3<>/dev/tcp/example.com/80
پس از باز شدن این اتصال، میتوانید دادهها را به آن ارسال کنید و همچنین دادهها را از آن بخوانید. این روش به شما نشان میدهد که پروتکل HTTP در سطوح پایین چگونه کار میکند.
نحوه ارسال یک درخواست GET:
برای دریافت داده، باید هدرهای (headers) صحیح را ارسال کنید. برای اعلام پایان درخواست، باید یک خط خالی در انتها قرار دهید.
مراحل زیر را دنبال کنید:
- متغیرهای host، port و path خود را تنظیم کنید.
- اتصال را با استفاده از
execباز کنید. - از
printfبرای ارسال درخواست GET استفاده کنید. برای پایان خطوط از\r\nاستفاده کنید. - از
catیا یک حلقه (loop) برای خواندن پاسخ استفاده کنید. - پس از اتمام کار، توصیفگر فایل را ببندید.
اسکریپت نمونه:
HOST="example.com"
PORT=80
REQUEST_PATH="/"
exec 3<>/dev/tcp/${HOST}/${PORT}
printf "GET ${REQUEST_PATH} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
cat <&3
exec 3>&-
این تکنیک به شما کمک میکند تا بفهمید کلاینتها و سرورها چگونه با یکدیگر ارتباط برقرار میکنند. این یک مهارت مفید برای عیبیابی (debugging) در سیستمهای مینیمالیستی است.