HTTP-запити без curl: пояснення Bash /dev/tcp
Ви перебуваєте всередині полегшеного Docker-контейнера.
Вам потрібно перевірити API-ендпоінт.
Ви вводите curl і отримуєте "command not found".
Ви пробуєте wget і отримуєте ту саму помилку.
Панікувати не варто.
Bash має приховану функцію, вбудовану в його ядро.
Вона називається /dev/tcp.
Ця функція дозволяє відкривати сирі TCP-з'єднання без встановлення будь-яких інструментів. Вона працює майже на будь-якій системі Linux.
Як це працює:
Коли ви звертаєтесь до /dev/tcp/hostname/port, Bash відкриває сокет-з'єднання.
Це специфічна функція Bash.
Вона не працюватиме в sh або zsh.
Магічна команда:
exec 3<>/dev/tcp/hostname/port
Цей рядок відкриває двонаправлений дескриптор файлу. Ви можете записувати в нього дані та зчитувати відповіді.
Приклад 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 конвеєрах без жодних залежностей. • Тестування зв'язку на вбудованих системах. • Вивчення того, як саме працюють HTTP-заголовки.
Важливі обмеження, про які слід пам'ятати:
• Жодного HTTPS: Bash не може обробляти TLS/SSL шифрування. Використовуйте openssl s_client для зашифрованого трафіку.
• Жодних перенаправлень: ви повинні обробляти їх вручну.
• Жодної складності: не використовуйте це для клієнтів HTTP у продакшені. Для цього використовуйте curl.
Завжди додавайте заголовок Connection: close.
Якщо ви забудете про нього, ваш скрипт може зависнути в очікуванні відповіді від сервера.
Наступного разу, коли ви опинитеся в обмеженому серверному середовищі, скористайтеся цим трюком. Він перетворює глухий кут на робочий інструмент.
Source: https://dev.to/onsen/http-requests-without-curl-bash-devtcp-explained-5852
Optional learning community: https://t.me/GyaanSetuAi