curl

Материал из llmdocs — справочник разработчика
curl
Типутилита командной строки и библиотека
АвторДаниэль Стенберг
Первый выпуск1998 (предшественники — с 1996)
ЯзыкC
Лицензияcurl license (разрешительная, в духе MIT)
ПротоколыHTTP/1.1, HTTP/2, HTTP/3, FTP, SFTP, SCP, SMTP, IMAP, MQTT, WebSocket и др.
Встроен вmacOS, Windows 10 и новее, большинство дистрибутивов Linux
Сайтcurl.se

curl (от client URL, произносится «кёрл») — утилита командной строки для передачи данных по URL, а libcurl — библиотека, на которой она построена. curl умеет отправлять и получать данные по HTTP и HTTPS, FTP, SFTP, SMTP и ещё нескольким десяткам протоколов, поддерживает TLS, прокси, cookies, загрузку файлов и аутентификацию. Для разработчика это главный инструмент проверки веб-сервисов и REST-API прямо из терминала.

libcurl встроена в огромное количество программ и устройств — от автомобилей и телевизоров до игровых консолей, — поэтому curl часто называют одной из самых распространённых программ в мире.[3]

История

Шведский программист Даниэль Стенберг в 1996 году начал развивать небольшую программу httpget для загрузки курсов валют в IRC-бот. После добавления FTP её переименовали в urlget, а 20 марта 1998 года вышла версия 4.0 под именем curl.[2] Библиотека libcurl появилась в 2000 году. Стенберг остаётся ведущим разработчиком больше четверти века; проект выпускает новую версию примерно каждые восемь недель и известен тщательной работой с уязвимостями.

curl распространяется под собственной разрешительной лицензией, близкой к MIT, что позволяет использовать libcurl в закрытых продуктах.[4] С 2018 года curl входит в состав Windows 10, в macOS и большинстве дистрибутивов Linux он есть из коробки.

Основы

curl https://example.com                     # тело ответа в stdout
curl -o page.html https://example.com        # сохранить в файл
curl -O https://example.com/file.tar.gz      # сохранить под исходным именем
curl -L https://git.io/xyz                   # следовать редиректам
curl -I https://example.com                  # только заголовки (HEAD)
curl -i https://example.com                  # заголовки и тело
curl -v https://example.com                  # подробно: DNS, TLS, заголовки
curl -fsSL https://example.com/install.sh    # тихо, но с ошибками; падать на HTTP 4xx/5xx

По умолчанию curl не считает ответы 404 или 500 ошибкой и завершается с кодом 0. Флаг -f (--fail) делает код выхода ненулевым при кодах ответа 400 и выше — без него скрипты в Bash молча продолжают работу после сбоя.

Работа с API

# GET с заголовком авторизации
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/v1/users/42

# POST JSON (флаг --json появился в 7.82.0, 2022)
curl --json '{"name": "Алиса"}' https://api.example.com/v1/users

# то же явно
curl -X POST -H 'Content-Type: application/json' \
     -d '{"name": "Алиса"}' https://api.example.com/v1/users

# отправка формы и файла
curl -F 'avatar=@photo.jpg' -F 'user=42' https://api.example.com/upload

# разбор ответа через jq
curl -s https://api.github.com/repos/curl/curl | jq '.stargazers_count'

Флаг -d автоматически переключает метод на POST, а -X задаёт метод явно (PUT, PATCH, DELETE). Ответ в JSON удобно разбирать утилитой jq.[1]

Диагностика

curl — первый инструмент при отладке сетевых проблем:

# время по фазам: DNS, соединение, TLS, первый байт, всего
curl -o /dev/null -s -w 'dns %{time_namelookup}  tcp %{time_connect}  tls %{time_appconnect}  ttfb %{time_starttransfer}  total %{time_total}\n' https://example.com

# обратиться к конкретному IP, сохранив имя хоста (SNI и заголовок Host)
curl --resolve example.com:443:203.0.113.10 https://example.com

curl --http2 -I https://example.com          # принудительно HTTP/2
curl --http3 -I https://example.com          # HTTP/3 поверх QUIC (если собран с поддержкой)
curl -x socks5h://127.0.0.1:1080 https://example.com   # через прокси

Ключ --resolve позволяет проверить новый сервер до переключения DNS, а -v показывает рукопожатие TLS и выбранный по ALPN протокол. Поддержка HTTP/3 зависит от того, с какой TLS-библиотекой собран curl.[5]

Безопасность

  • Ключ -k (--insecure) отключает проверку сертификата сервера. Он допустим только для отладки: в скриптах он делает соединение уязвимым для перехвата. Правильное решение — указать доверенный корневой сертификат через --cacert.[6]
  • Шаблон установки curl ... | sh запускает чужой код без проверки; безопаснее скачать скрипт, прочитать и только потом выполнить.
  • Токены в командной строке видны в истории оболочки и списке процессов; их лучше передавать через переменные окружения или файл (-H @headers.txt, --netrc).

Альтернативы

Wget удобнее для рекурсивной загрузки сайтов и докачки файлов; HTTPie и xh предлагают более дружелюбный синтаксис для API. В Python ту же роль играют библиотеки requests и httpx, а многие из них умеют превращать запрос в эквивалентную команду curl — она стала универсальным языком описания HTTP-запросов в документации.

См. также

Источники

  1. curl — man page
  2. curl — History
  3. Everything curl — книга Даниэля Стенберга
  4. curl — License
  5. curl — HTTP/3 support
  6. curl — SSL certificate verification