درخواست‌های HTTP بدون curl: توضیح Bash /dev/tcp

شما داخل یک کانتینر داکر بسیار سبک و محدود شده هستید. باید یک نقطه اتصال (endpoint) API را بررسی کنید. دستور curl را تایپ می‌کنید و با خطای "command not found" مواجه می‌شوید. wget را امتحان می‌کنید و همان خطا را دریافت می‌کنید.

نیازی به وحشت نیست. Bash یک قابلیت پنهان در هسته خود دارد. این قابلیت /dev/tcp نام دارد.

این ویژگی به شما اجازه می‌دهد بدون نصب هیچ ابزاری، اتصالات TCP خام برقرار کنید. این قابلیت تقریباً روی هر سیستم لینوکسی کار می‌کند.

نحوه عملکرد: وقتی به /dev/tcp/hostname/port ارجاع می‌دهید، Bash یک اتصال سوکت باز می‌کند. این یک قابلیت مخصوص Bash است. در sh یا zsh کار نخواهد کرد.

دستور جادویی: exec 3<>/dev/tcp/hostname/port

این خط یک توصیف‌گر فایل (file descriptor) دوطرفه باز می‌کند. می‌توانید داده‌ها را در آن بنویسید و پاسخ‌ها را از آن بخوانید.

مثال درخواست GET:

#!/bin/bash
exec 3<>/dev/tcp/example.com/80
printf "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n" >&3
cat <&3
exec 3>&-

چرا این کار مفید است: • عیب‌یابی در محیط‌های حداقلی که امکان نصب پکیج وجود ندارد. • اجرای بررسی‌های سلامت (health checks) در خط لوله‌های CI/CD بدون نیاز به هیچ وابستگی. • تست اتصال در سیستم‌های نهفته (embedded systems). • یادگیری دقیق نحوه عملکرد هدرهای HTTP.

محدودیت‌های مهمی که باید به خاطر بسپارید: • بدون HTTPS: Bash نمی‌تواند رمزنگاری TLS/SSL را مدیریت کند. برای ترافیک رمزنگاری شده از openssl s_client استفاده کنید. • بدون Redirect: باید آن‌ها را به صورت دستی مدیریت کنید. • بدون پیچیدگی: از این روش برای کلاینت‌های HTTP در محیط عملیاتی (production) استفاده نکنید. برای آن کار از curl استفاده کنید.

همیشه هدر Connection: close را اضافه کنید. اگر آن را فراموش کنید، ممکن است اسکریپت شما در انتظار پاسخ سرور معطل (hang) بماند.

دفعه بعد که در یک سرور محدود شده گیر افتادید، از این ترفند استفاده کنید. این کار یک بن‌بست را به یک ابزار کاربردی تبدیل می‌کند.

Source: https://dev.to/onsen/http-requests-without-curl-bash-devtcp-explained-5852

Optional learning community: https://t.me/GyaanSetuAi