Команда 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.
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-запроса
Заголовки, авторизация и 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 или массовая загрузка файлов.
| Критерий | curl | wget |
|---|---|---|
| Основное назначение | Передача данных, работа с 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.