curl
Передача данных по URL: HTTP, HTTPS, FTP и другим протоколам из командной строки
Описание
curl (Client URL) — утилита командной строки для передачи данных с поддержкой более 25 протоколов: HTTP, HTTPS, FTP, FTPS, SCP, SFTP, IMAP, SMTP и многих других. Разработана Даниэлем Стенбергом в 1997 году, сегодня входит в состав практически всех Linux-дистрибутивов, macOS и доступна на Windows. curl лежит в основе популярной библиотеки libcurl, которую используют тысячи приложений.
Основные применения: тестирование REST API, скачивание файлов, отладка HTTP-запросов, работа с веб-сервисами из скриптов, проверка заголовков ответов, загрузка файлов на сервер. В отличие от браузера, curl показывает полный цикл запроса/ответа с заголовками, кодами статусов и временными метриками — это делает её незаменимым инструментом для разработчиков и DevOps.
curl работает в конвейере: принимает URL как аргумент, отправляет запрос, выводит тело ответа в stdout. Это позволяет комбинировать её с jq для обработки JSON, с grep для фильтрации, с перенаправлением в файл для сохранения. Флаги -v и --trace показывают полный дамп соединения на уровне байтов.
Синтаксис
| Часть | Описание |
|---|---|
| [опции] | Флаги для управления методом, заголовками, аутентификацией и выводом |
| URL | Адрес ресурса (можно передать несколько URL подряд) |
| stdout | По умолчанию ответ выводится в stdout; -o file сохраняет в файл |
Флаги и опции
| Флаг | Описание |
|---|---|
| -X METHOD | HTTP-метод: GET (по умолчанию), POST, PUT, PATCH, DELETE |
| -H "Header: value" | Добавить HTTP-заголовок. Можно использовать несколько раз |
| -d "data" | Тело запроса (data). Автоматически устанавливает метод POST. Для JSON: -d '{"key":"val"}' |
| -o FILE | Сохранить вывод в файл вместо stdout |
| -O | Сохранить файл с оригинальным именем из URL (как wget) |
| -L | Следовать редиректам (301, 302). Без этого флага curl останавливается на редиректе |
| -I | Только заголовки ответа (метод HEAD): не скачивает тело |
| -v | Подробный режим: показать заголовки запроса и ответа, TLS handshake |
| -s | Тихий режим (silent): не показывать прогресс и сообщения об ошибках |
| -S | Показывать ошибки даже в тихом режиме (-s). Обычно используется вместе: -sS |
| -u user:pass | Базовая HTTP-аутентификация |
| -k / --insecure | Не проверять SSL-сертификат сервера (для самоподписанных в разработке) |
| -c FILE | Сохранить cookies в файл (cookie jar) |
| -b FILE/data | Отправить cookies: из файла или строку "name=value" |
| --max-time SEC | Максимальное время ожидания всей операции в секундах |
| -w FORMAT | Вывести информацию после запроса (время, код ответа): -w "%{http_code}\n" |
Паттерны использования
GET-запрос к REST API
Получить данные с API и красиво отформатировать через jq.
# Простой GET
curl https://api.example.com/users
# С заголовком авторизации
curl -H "Authorization: Bearer TOKEN" \
https://api.example.com/users
# Форматировать JSON через jq
curl -s https://api.example.com/users | jq '.[]'
POST с JSON-телом
Отправить JSON-данные в теле POST-запроса.
# POST с JSON
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"Alice","email":"alice@ex.com"}' \
https://api.example.com/users
# Из файла
curl -X POST \
-H "Content-Type: application/json" \
-d @payload.json \
https://api.example.com/users
Скачать файл
Загрузить файл с отображением прогресса.
# Сохранить с оригинальным именем
curl -O -L https://example.com/archive.tar.gz
# Сохранить с указанным именем
curl -o myapp.tar.gz \
https://releases.example.com/v1.2.tar.gz
# Продолжить прерванную загрузку
curl -C - -O https://example.com/bigfile.iso
Проверить HTTP-заголовки и код ответа
Отладить ответ сервера без скачивания тела.
# Только заголовки (HEAD-запрос)
curl -I https://example.com
# Подробный вывод (запрос + ответ)
curl -v https://api.example.com/health
# Только HTTP-код
curl -s -o /dev/null -w "%{http_code}" \
https://example.com
Загрузить файл на сервер (PUT/multipart)
Отправить файл через multipart form или PUT.
# Multipart form (как )
curl -F "file=@photo.jpg" \
-F "description=My photo" \
https://api.example.com/upload
# PUT с файлом
curl -X PUT \
-H "Content-Type: application/octet-stream" \
--data-binary @firmware.bin \
https://api.example.com/device/firmware
Работа с cookies и сессией
Логин и работа с сессионными cookies.
# Логин, сохранить cookies
curl -c cookies.txt \
-d "user=admin&pass=secret" \
https://example.com/login
# Следующий запрос с cookies
curl -b cookies.txt \
https://example.com/dashboard
# Проверить производительность
curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTotal: %{time_total}s\n" \
-o /dev/null -s https://example.com
Советы и предупреждения
В скриптах используйте
curl -sS: флаг -s убирает прогресс-бар, а -S сохраняет вывод ошибок. Это предотвращает засорение stdout мусором при работе в конвейере с jq или grep.
Флаг
--fail (-f) заставляет curl завершиться с ненулевым кодом при HTTP-ошибке (4xx, 5xx). Это позволяет использовать curl --fail URL || exit 1 в скриптах и CI/CD-пайплайнах для остановки при ошибке.
Часто используемые флаги можно прописать в
~/.curlrc, например: --silent, --show-error, --location. Тогда не придётся добавлять их вручную каждый раз. Строки в файле — один флаг на строку.
Флаг
-k отключает проверку SSL-сертификата — это допустимо только при локальной разработке с самоподписанными сертификатами. Никогда не используйте в продакшн-скриптах и CI/CD для внешних URL: это открывает вектор MITM-атаки, при которой злоумышленник может перехватить данные, включая токены и пароли.
При использовании
-u user:pass или -d "password=secret" учётные данные видны в списке процессов (ps aux) и могут попасть в историю shell. Для чувствительных данных используйте переменные окружения и передавайте их через -d "@-" (чтение из stdin) или через файл с -d "@creds.txt".