בקשות HTTP ללא curl: הסבר על Bash /dev/tcp

אתם נמצאים בתוך Docker container מינימליסטי. אתם צריכים לבדוק API endpoint. אתם מקלידים curl ומקבלים "command not found". אתם מנסים wget ומקבלים את אותה השגיאה.

אין צורך להיכנס ללחץ. ל-Bash יש תכונה נסתרת המובנית בליבה שלו. היא נקראת /dev/tcp.

התכונה הזו מאפשרת לכם לפתוח חיבורי TCP גולמיים (raw) מבלי להתקין כלים נוספים. היא עובדת כמעט בכל מערכת Linux.

איך זה עובד: כשאתם מתייחסים ל-/dev/tcp/hostname/port, Bash פותח חיבור socket. זוהי תכונה ספציפית ל-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>&-

למה זה שימושי: • ניפוי שגיאות (Debugging) בסביבות מינימליסטיות שבהן לא ניתן להתקין חבילות. • הרצת בדיקות תקינות (health checks) בצינורות CI/CD ללא תלויות (zero dependencies). • בדיקת קישוריות במערכות משובצות (embedded systems). • למידה מדויקת של האופן שבו כותרות HTTP (HTTP headers) עובדות.

מגבלות חשובות שחשוב לזכור: • ללא HTTPS: Bash אינו יכול לטפל בהצפנת TLS/SSL. השתמשו ב-openssl s_client עבור תעבורה מוצפנת. • ללא הפניות (Redirects): עליכם לטפל בהן ידנית. • ללא מורכבות: אל תשתמשו בזה עבור לקוחות HTTP בסביבת ייצור (production). השתמשו ב-curl לצורך כך.

תמיד כללו את הכותרת Connection: close. אם תשכחו אותה, הסקריפט שלכם עלול להיתקע בזמן ההמתנה לשרת.

בפעם הבאה שתיתקעו בשרת חסום (locked-down), השתמשו בטריק הזה. הוא הופך מבוי סתום לכלי עבודה פעיל.

מקור: https://dev.to/onsen/http-requests-without-curl-bash-devtcp-explained-5852

קהילת למידה אופציונלית: https://t.me/GyaanSetuAi