Что такое curl

Скопировано:

Что такое curl?

curl - это мощная утилита командной строки для передачи данных между серверами с использованием различных протоколов: HTTP, HTTPS, FTP, SFTP, SCP, SMTP и многих других. Часто используется для тестирования API, загрузки файлов, отладки веб-запросов и автоматизации задач.

Установка curl

  • Windows: уже встроен в Windows 10+ (в PowerShell и CMD).

    Linux/macOS: обычно предустановлен. Если нет - установите через пакетный менеджер:

  • sudo apt install curl# Debian/Ubuntu

  • sudo dnf install curl# Fedora

  • brew install curl# macOS

Базовый синтаксис

curl [опции] [URL]

Простые запросы

  • curl http://example.com - получает содержимое страницы.

  • curl -I http://example.com - показывает только HTTP-заголовки (HEAD-запрос).

  • curl -L http://bit.ly/123 - следует за редиректами (301/302).

  • curl -v http://example.com - выводит подробную информацию (verbose), включая заголовки и этапы соединения.

  • curl -s http://example.com - тихий режим (без индикатора прогресса).

  • curl -o page.html http://example.com - сохраняет ответ в файл page.html.

  • curl -O http://example.com/file.zip - сохраняет файл с оригинальным именем.

HTTP-методы

  • curl -X GET http://api.site.com/users - явное указание метода GET (по умолчанию).

  • curl -X POST http://api.site.com/users - POST-запрос.

  • curl -X PUT http://api.site.com/users/1 - обновление ресурса.

  • curl -X DELETE http://api.site.com/users/1 - удаление.

Отправка данных

Для POST/PUT запросов:

  • curl -d "name=Иван&age=25" http://api.site.com/users - отправка данных в формате application/x-www-form-urlencoded.

  • curl -H "Content-Type: application/json" -d "{\"name\":\"Иван\"}" http://api.site.com/users - отправка JSON.

  • curl -F "file=@photo.jpg" http://site.com/upload - отправка файла через multipart/form-data (как форма).

  • curl --data-binary @file.txt http://site.com/data - отправка файла "как есть", без преобразований (полезно для бинарных данных).

Работа с заголовками

  • curl -H "Authorization: Bearer abc123" http://api.site.com/data - добавление авторизации.

  • curl -H "User-Agent: Mozilla/5.0" http://site.com - подмена User-Agent.

  • curl -H "Accept: application/json" http://api.site.com - указание желаемого формата ответа.

  • curl -H "X-API-Key: 12345" http://api.site.com - передача кастомного заголовка.

  • curl --compressed http://site.com - автоматически распаковывает ответы с gzip, deflate.

Аутентификация

  • curl -u username:password http://site.com/secure - Basic Auth.

  • curl --ntlm -u user:pass http://intranet/site - NTLM-аутентификация (для Windows-серверов).

  • curl --digest -u user:pass http://site.com - Digest Auth.

  • curl --key client.key --cert client.crt https://api.site.com - клиентский SSL-сертификат.

Работа с куками

  • curl -b "sessionid=abc123" http://site.com - отправка куки вручную.

  • curl -c cookies.txt http://site.com - сохраняет куки в файл после запроса.

  • curl -b cookies.txt http://site.com - читает и отправляет куки из файла.

HTTPS и SSL

  • curl https://site.com - работает "из коробки", если сертификат валиден.

  • curl -k https://self-signed.site - игнорирует ошибки SSL (небезопасно!)

  • curl --cacert ca.pem https://site.com - использует пользовательский CA-сертификат.

  • curl --insecure https://site.com - то же, что -k.

Таймауты и повторы

  • curl --max-time 30 http://site.com - максимальное время выполнения (в секундах).

  • curl --connect-timeout 10 http://site.com - таймаут подключения.

  • curl --retry 3 http://site.com - повторить до 3 раз при ошибке.

  • curl --retry-delay 5 http://site.com - задержка между попытками.

Прокси

  • curl -x http://proxy:8080 http://site.com - использование HTTP-прокси.

  • curl --socks5 127.0.0.1:1080 http://site.com - SOCKS5 прокси.

  • curl -x http://user:pass@proxy:8080 http://site.com - прокси с аутентификацией.

Пример: GET-запрос к API

curl -s -H "Authorization: Bearer token123" \
     -H "Accept: application/json" \
     "https://api.github.com/user"

Пример: POST с JSON

curl -X POST \
     -H "Content-Type: application/json" \
     -d "{\"title\":\"Новая задача\",\"done\":false}" \
     https://api.site.com/tasks

Пример: Загрузка файла

curl -F "upload=@report.pdf" \
     -H "Authorization: Bearer xyz" \
     https://site.com/upload

Пример: Сохранение с проверкой кода ответа

curl -f -o backup.sql "http://db.site.com/dump.sql" \
|| echo "Ошибка загрузки!"

Флаг -f (fail) заставляет curl возвращать ненулевой код при HTTP-ошибках (4xx/5xx).

Пример: Скрипт с логированием

#!/bin/bash
echo "[$(date)] Запуск..." >> curl.log
curl -s -o /dev/null -w "%{http_code}" http://site.com >> curl.log 2>&1
echo "" >> curl.log

Полезные опции

  • --silent (-s) - без индикатора прогресса.

  • --write-out (-w) - вывод дополнительной информации (время, код ответа и т.д.). Пример: -w "Time: %{time_total}s\n"

  • --user-agent (-A) - короткий способ задать User-Agent: -A "MyBot/1.0"

  • --location (-L) - следовать за редиректами.

  • --fail (-f) - не выводить тело при HTTP-ошибках и вернуть код ошибки.

  • --output (-o) - сохранить в файл.

  • --create-dirs (-O) - создавать директории при сохранении.

Формат вывода статистики (-w)

Пример:

curl -w "DNS: %{time_namelookup}s | Connect: %{time_connect}s | Total: %{time_total}s\n" \
     -o /dev/null -s http://example.com

Полезные переменные:

  • %{http_code} - HTTP-статус
  • %{time_total} - общее время
  • %{time_namelookup} - время DNS
  • %{size_download} - размер скачанного (в байтах)
  • %{speed_download} - скорость

Безопасность и советы

  • Не используйте -k в продакшене - это уязвимость.
  • Храните токены в переменных окружения, а не в командах: curl -H "Authorization: Bearer $TOKEN" ...
  • Тестируйте запросы в http://httpbin.org - отличный инструмент для отладки.

  • Для сложных сценариев лучше использовать httpie или Postman, но curl незаменим в скриптах.
  • Используйте jq для парсинга JSON: curl ... | jq .data.id

Совет: Создайте алиасы в .bashrc или .zshrc:

alias c='curl -s'
alias cj='curl -s -H "Accept: application/json"'
alias cu='curl -u'
Скопировано:
Назад к разделу: Записи