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