בקשות 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