Виконуйте HTTP-запити без curl
Ви можете працювати на сервері, де немає curl або wget. Вам потрібно протестувати endpoint, але ці інструменти відсутні. Ви можете використовувати Bash для надсилання HTTP-запитів безпосередньо.
У Bash є прихована функція під назвою /dev/tcp. Це не справжній файл. Це спеціальний пристрій, який розуміє Bash. Коли ви записуєте в /dev/tcp/hostname/port, Bash відкриває для вас TCP-з'єднання.
Як це працює:
Ви використовуєте команду exec для керування дескрипторами файлів. Наприклад, ви можете відкрити дескриптор файлу 3 для читання та запису.
Синтаксис виглядає так:
exec 3<>/dev/tcp/example.com/80
Щойно це з'єднання відкрито, ви можете надсилати в нього дані. Ви також можете читати з нього дані. Цей метод демонструє, як протокол HTTP працює на низькому рівні.
Як зробити GET-запит:
Щоб отримати дані, ви повинні надіслати правильні заголовки. В кінці потрібно додати порожній рядок, щоб позначити завершення вашого запиту.
Виконайте ці кроки:
- Встановіть змінні host, port та path.
- Відкрийте з'єднання за допомогою
exec. - Використовуйте
printfдля надсилання GET-запиту. Використовуйте\r\nдля закінчення рядків. - Використовуйте
catабо цикл, щоб прочитати відповідь. - Закрийте дескриптор файлу після завершення.
Приклад скрипта:
HOST="example.com"
PORT=80
REQUEST_PATH="/"
exec 3<>/dev/tcp/${HOST}/${PORT}
printf "GET ${REQUEST_PATH} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
cat <&3
exec 3>&-
Ця техніка допоможе вам зрозуміти, як клієнти та сервери взаємодіють один з одним. Це корисна навичка для налагодження на мінімалістичних системах.