curl के बिना HTTP Requests: Bash /dev/TCP की व्याख्या

आप एक स्ट्रिप्ड-डाउन (stripped-down) Docker कंटेनर के अंदर हैं। आपको एक API endpoint चेक करने की ज़रूरत है। आप curl टाइप करते हैं और "command not found" का एरर मिलता है। आप wget ट्राई करते हैं और वही एरर मिलता है।

आपको घबराने की ज़रूरत नहीं है। Bash के कोर में एक छिपा हुआ फीचर है। इसे /dev/tcp कहा जाता है।

यह फीचर बिना किसी टूल को इंस्टॉल किए आपको रॉ (raw) TCP कनेक्शन खोलने की अनुमति देता है। यह लगभग किसी भी Linux सिस्टम पर काम करता है।

यह कैसे काम करता है: जब आप /dev/tcp/hostname/port का संदर्भ देते हैं, तो Bash एक सॉकेट कनेक्शन खोलता है। यह एक Bash-विशिष्ट (Bash-specific) फीचर है। यह sh या zsh में काम नहीं करेगा।

जादुई कमांड: exec 3<>/dev/tcp/hostname/port

यह लाइन एक द्विदिश (bidirectional) फ़ाइल डिस्क्रिप्टर खोलती है। आप इसमें डेटा लिख सकते हैं और रिस्पॉन्स वापस पढ़ सकते हैं।

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>&-

यह क्यों उपयोगी है: • न्यूनतम (minimal) वातावरण में डिबगिंग करना जहाँ आप पैकेज इंस्टॉल नहीं कर सकते। • बिना किसी डिपेंडेंसी के CI/CD पाइपलाइनों में हेल्थ चेक चलाना। • एम्बेडेड सिस्टम पर कनेक्टिविटी टेस्ट करना। • यह सीखना कि HTTP हेडर वास्तव में कैसे काम करते हैं।

याद रखने योग्य महत्वपूर्ण सीमाएँ: • No HTTPS: Bash TLS/SSL एन्क्रिप्शन को हैंडल नहीं कर सकता। एन्क्रिप्टेड ट्रैफिक के लिए openssl s_client का उपयोग करें। • No Redirects: आपको इन्हें मैन्युअल रूप से हैंडल करना होगा। • No Complexity: इसे प्रोडक्शन HTTP क्लाइंट्स के लिए उपयोग न करें। उसके लिए curl का उपयोग करें।

हमेशा Connection: close हेडर शामिल करें। यदि आप इसे भूल जाते हैं, तो आपका स्क्रिप्ट सर्वर का इंतज़ार करते समय हैंग (hang) हो सकता है।

अगली बार जब आप किसी लॉक-डाउन सर्वर में फंस जाएं, तो इस ट्रिक का उपयोग करें। यह एक बंद रास्ते को एक काम करने वाले टूल में बदल देता है।

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

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