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-запросов в документации.