การส่ง HTTP Requests โดยไม่ต้องใช้ curl: อธิบายการใช้ Bash /dev/tcp

คุณกำลังอยู่ใน Docker container ที่ถูกตัดทอนฟีเจอร์ออกจนเหลือแต่ส่วนที่จำเป็น คุณจำเป็นต้องตรวจสอบ API endpoint คุณพิมพ์ curl แล้วเจอข้อความ "command not found" คุณลองใช้ wget แล้วก็เจอข้อความผิดพลาดแบบเดียวกัน

ไม่ต้องตกใจไป Bash มีฟีเจอร์ลับที่ถูกสร้างไว้ในตัวมันเอง มันเรียกว่า /dev/tcp

ฟีเจอร์นี้ช่วยให้คุณเปิดการเชื่อมต่อ TCP แบบดิบ (raw TCP connections) ได้โดยไม่ต้องติดตั้งเครื่องมือใดๆ มันสามารถใช้งานได้กับระบบ Linux เกือบทุกระบบ

หลักการทำงาน: เมื่อคุณอ้างอิงถึง /dev/tcp/hostname/port ตัว Bash จะเปิดการเชื่อมต่อ socket ขึ้นมา นี่เป็นฟีเจอร์เฉพาะของ Bash เท่านั้น มันจะไม่ทำงานใน sh หรือ zsh

คำสั่งมหัศจรรย์: exec 3<>/dev/tcp/hostname/port

บรรทัดนี้จะเปิด file descriptor แบบสองทิศทาง (bidirectional) คุณสามารถเขียนข้อมูลลงไปและอ่านการตอบกลับกลับมาได้

ตัวอย่างการส่ง GET request:

#!/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>&-

ทำไมสิ่งนี้ถึงมีประโยชน์: • การดีบั๊ก (Debugging) ในสภาพแวดล้อมที่จำกัดซึ่งคุณไม่สามารถติดตั้งแพ็กเกจได้ • การรัน health checks ใน CI/CD pipelines โดยไม่ต้องมี dependencies ใดๆ • การทดสอบการเชื่อมต่อบนระบบฝังตัว (embedded systems) • การเรียนรู้ว่า HTTP headers ทำงานอย่างไรอย่างละเอียด

ข้อจำกัดสำคัญที่ควรจำ: • ไม่รองรับ HTTPS: Bash ไม่สามารถจัดการการเข้ารหัส TLS/SSL ได้ ให้ใช้ openssl s_client สำหรับทราฟฟิกที่มีการเข้ารหัส • ไม่รองรับการ Redirect: คุณต้องจัดการเรื่องนี้ด้วยตัวเอง • ไม่เหมาะกับงานที่ซับซ้อน: อย่าใช้สิ่งนี้สำหรับ HTTP client ในระบบ production ให้ใช้ curl แทน

ควรใส่ header Connection: close ไว้เสมอ หากคุณลืม มันอาจทำให้สคริปต์ของคุณค้างในขณะที่รอการตอบกลับจากเซิร์ฟเวอร์

ครั้งต่อไปที่คุณติดอยู่ในเซิร์ฟเวอร์ที่ถูกจำกัดสิทธิ์ ให้ลองใช้เทคนิคนี้ มันจะเปลี่ยนทางตันให้กลายเป็นเครื่องมือที่ใช้งานได้จริง

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

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