Команда curl -X POST возвращает пустой ответ или ошибку connection refused — чаще всего причина в неверно указанном порте, отсутствующем заголовке Content-Type или в том, что сервер слушает только localhost, а запрос идёт на внешний адрес. Прежде чем переписывать скрипт, проверьте доступность сервиса простым curl -v http://адрес — флаг -v покажет, на каком этапе обрывается соединение.

Работа с HTTP из командной строки — базовый навык для администрирования серверов, отладки API и автоматизации. В этой статье разберём два главных инструмента — curl и wget, научимся отправлять GET- и POST-запросы, передавать заголовки и JSON, сохранять файлы и обрабатывать ответы в bash-скриптах.

Что такое HTTP-запрос и зачем он нужен в Bash

HTTP — протокол обмена данными между клиентом и сервером. Каждый запрос состоит из метода (GET, POST, PUT, DELETE и других), адреса, заголовков и, при необходимости, тела. Из терминала такие запросы используют для проверки доступности сайтов, тестирования REST API, скачивания файлов и интеграции скриптов с внешними сервисами.

В отличие от браузера, консольные утилиты дают полный контроль: вы видите сырой ответ сервера, коды состояния и можете встроить запрос в любой скрипт автоматизации. Это особенно полезно на серверах без графического интерфейса, где браузер попросту недоступен.

Установка и проверка curl и wget

В большинстве дистрибутивов Linux утилита curl предустановлена. Проверить её наличие можно командой curl --version. Если утилита отсутствует, установите её через пакетный менеджер вашей системы.

sudo apt install curl wget    # Debian/Ubuntu

sudo dnf install curl wget # Fedora/RHEL

sudo pacman -S curl wget # Arch Linux

На macOS curl входит в базовую поставку системы, а wget обычно ставится через Homebrew. В Windows 10 и новее curl также доступен из коробки в PowerShell и CMD.

💡

Проверяйте версию curl командой curl --version: в старых выпусках могут отсутствовать некоторые флаги, например --json появился лишь в свежих версиях.

GET-запросы: получение данных

Простейший запрос выполняется одной командой — curl по умолчанию использует метод GET:

curl https://api.example.com/status

Ответ сервера выводится прямо в терминал. Чтобы увидеть заголовки ответа вместе с телом, добавьте флаг -i, а для полной отладочной информации — -v. Если нужно сохранить результат в файл, используйте -o имя_файла.

  • 🔍 curl -I адрес — получить только заголовки ответа (HEAD-запрос)
  • 💾 curl -o page.html адрес — сохранить ответ в файл
  • 🔁 curl -L адрес — следовать за редиректами (критично для сокращённых ссылок)
  • ⏱️ curl --max-time 10 адрес — ограничить время ожидания ответа

Аналогичная задача решается через wget: команда wget -qO- адрес выводит содержимое в терминал, а без флагов wget сохраняет файл в текущий каталог. Для разового скачивания wget удобнее, для работы с API — curl.

📊 Какой инструмент вы используете для HTTP-запросов в терминале?
curl
wget
httpie
Свои скрипты на Python

POST-запросы и отправка данных

Для отправки данных на сервер используется метод POST. В curl он включается флагом -X POST, а данные передаются через -d:

curl -X POST https://api.example.com/users \

-H "Content-Type: application/json" \

-d '{"name": "Ivan", "role": "admin"}'

Здесь заголовок Content-Type: application/json сообщает серверу формат тела запроса. Без него многие API вернут ошибку 415 Unsupported Media Type или просто проигнорируют тело запроса — это одна из самых частых причин «неработающего» POST-запроса.

Для отправки данных формы (как из HTML-формы) формат другой:

curl -X POST https://example.com/login \

-d "username=user&password=secret"

⚠️ Внимание: пароли и токены в командной строке остаются в истории shell и могут быть видны в списке процессов. Для скриптов храните секреты в переменных окружения или файлах с ограниченными правами доступа.

☑️ Проверка перед отправкой POST-запроса

Выполнено: 0 / 5

Заголовки, авторизация и cookies

Заголовки добавляются флагом -H "Имя: значение", их может быть несколько в одной команде. Типовой сценарий — авторизация по токену:

curl https://api.example.com/profile \

-H "Authorization: Bearer $TOKEN" \

-H "Accept: application/json"

Для базовой HTTP-аутентификации есть отдельный флаг -u логин:пароль. Работа с cookies ведётся через -c (сохранить cookies в файл) и -b (отправить cookies из файла) — это позволяет сохранять сессию между запросами в скрипте.

Как посмотреть, что реально отправляет curl

Запустите команду с флагом -v (verbose). В выводе строки, начинающиеся с символа >, — это ваш запрос (метод, заголовки, тело), а строки с < — ответ сервера. Флаг --trace-ascii файл сохранит полный дамп обмена, включая бинарные данные.

Сравнение curl и wget

Обе утилиты умеют работать по HTTP, но ориентированы на разные задачи. Выбор зависит от сценария: тестирование API или массовая загрузка файлов.

Критерийcurlwget
Основное назначениеПередача данных, работа с APIСкачивание файлов
HTTP-методыВсе (GET, POST, PUT, DELETE и др.)В основном GET и POST
Рекурсивная загрузка сайтовНетДа, флаг -r
Докачка оборванных файловФлаг -C -Флаг -c
Вывод по умолчаниюВ stdout (терминал)В файл
💡

Для отладки API и скриптов выбирайте curl, для зеркалирования сайтов и скачивания больших файлов — wget. Обе утилиты дополняют друг друга.

Обработка ответов в bash-скриптах

В автоматизации важно не просто отправить запрос, но и проверить результат. Код ответа HTTP можно получить через флаг -w:

CODE=$(curl -s -o /dev/null -w "%{http_code}" https://example.com)

if [ "$CODE" -eq 200 ]; then

echo "Сервис доступен"

else

echo "Ошибка: код $CODE"

fi

Для разбора JSON-ответов удобна утилита jq — она извлекает нужные поля без регулярных выражений. Пример: curl -s адрес | jq '.field' выведет значение конкретного поля из ответа. Парсить JSON средствами самого bash не стоит — формат слишком сложен для надёжной обработки через grep и sed.

⚠️ Внимание: флаг -s (тихий режим) скрывает и сообщения об ошибках соединения. В отладочных скриптах используйте -sS — тихий режим с сохранением вывода ошибок.

Типичные ошибки и их диагностика

Разберём проблемы, с которыми чаще всего сталкиваются при HTTP-запросах из терминала. Возможная причина почти всегда определяется по коду ответа или тексту ошибки curl.

  • 🔌 Connection refused — порт закрыт или сервис не запущен; проверьте порт и адрес
  • 🔒 Ошибки SSL-сертификата — проверьте дату на машине и актуальность корневых сертификатов; флаг -k отключает проверку, но это небезопасно
  • 📛 Код 301/302 без перехода — добавьте флаг -L для следования редиректам
  • 🧱 Код 403 — сервер может блокировать запросы без заголовка User-Agent; добавьте его через -A
⚠️ Внимание: флаг -k (или --insecure) отключает проверку TLS-сертификата, что делает соединение уязвимым для перехвата. Используйте его только для локальной отладки и никогда — в рабочих скриптах с реальными данными.
💡

Сохраняйте удачные команды curl в шпаргалку или скрипт: составной запрос с заголовками и телом проще переиспользовать, чем собирать заново.

Часто задаваемые вопросы

Чем curl отличается от wget?

curl — универсальный клиент для передачи данных с поддержкой множества протоколов и всех HTTP-методов, ориентирован на работу с API. wget специализируется на скачивании файлов и умеет рекурсивно загружать целые сайты. Для тестирования API берите curl, для массовой загрузки — wget.

Как отправить JSON-файл в теле POST-запроса?

Используйте конструкцию curl -X POST -H "Content-Type: application/json" -d @data.json адрес — символ @ перед именем файла указывает curl прочитать тело из файла, а не из строки.

Почему curl выводит бинарный мусор вместо ответа?

Вероятно, сервер отвечает сжатыми данными (gzip), а curl не запросил их автоматическую распаковку. Добавьте флаг --compressed — curl запросит сжатый ответ и распакует его перед выводом.

Как узнать время ответа сервера?

Через флаг форматирования: curl -o /dev/null -s -w "Время: %{time_total} с\n" адрес. Переменная %{time_total} показывает полное время запроса, также доступны %{time_connect} и %{time_starttransfer} для детальной диагностики.

Можно ли использовать curl в Windows?

Да, начиная с Windows 10 утилита curl включена в систему и доступна в CMD и PowerShell. Учтите, что в PowerShell команда curl исторически была псевдонимом Invoke-WebRequest — для вызова настоящего curl используйте curl.exe.