linux ssh-network

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 показывают полный дамп соединения на уровне байтов.

Синтаксис

curl [опции] URL [URL ...] # Примеры форм URL: # https://api.example.com/users # http://localhost:8080/health # ftp://files.example.com/data.csv
ЧастьОписание
[опции]Флаги для управления методом, заголовками, аутентификацией и выводом
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

Советы и предупреждения

Совет: комбинация -sS для скриптов
В скриптах используйте curl -sS: флаг -s убирает прогресс-бар, а -S сохраняет вывод ошибок. Это предотвращает засорение stdout мусором при работе в конвейере с jq или grep.
Совет: --fail для проверки кода ответа в скриптах
Флаг --fail (-f) заставляет curl завершиться с ненулевым кодом при HTTP-ошибке (4xx, 5xx). Это позволяет использовать curl --fail URL || exit 1 в скриптах и CI/CD-пайплайнах для остановки при ошибке.
Совет: конфигурационный файл ~/.curlrc
Часто используемые флаги можно прописать в ~/.curlrc, например: --silent, --show-error, --location. Тогда не придётся добавлять их вручную каждый раз. Строки в файле — один флаг на строку.
Осторожно: -k / --insecure в продакшне
Флаг -k отключает проверку SSL-сертификата — это допустимо только при локальной разработке с самоподписанными сертификатами. Никогда не используйте в продакшн-скриптах и CI/CD для внешних URL: это открывает вектор MITM-атаки, при которой злоумышленник может перехватить данные, включая токены и пароли.
Осторожно: передача паролей через -u и -d
При использовании -u user:pass или -d "password=secret" учётные данные видны в списке процессов (ps aux) и могут попасть в историю shell. Для чувствительных данных используйте переменные окружения и передавайте их через -d "@-" (чтение из stdin) или через файл с -d "@creds.txt".