Выполняйте HTTP-запросы без curl
Возможно, вам придется работать на сервере без curl или wget. Вам нужно протестировать эндпоинт, но этих инструментов нет под рукой. Вы можете использовать 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>&-
Эта техника помогает понять, как клиенты и серверы взаимодействуют друг с другом. Это полезный навык для отладки в минималистичных системах.