# curl

> Утилита командной строки и библиотека libcurl для передачи данных по URL — HTTP(S), FTP, SFTP и десяткам других протоколов; стандартный инструмент для работы с веб-API.

Источник: https://llmdocs.ru/wiki/curl/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: утилита командной строки и библиотека
- **Автор**: Даниэль Стенберг
- **Первый выпуск**: 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://llmdocs.ru/wiki/http.md) и HTTPS, FTP, SFTP, SMTP и ещё нескольким десяткам протоколов, поддерживает [TLS](https://llmdocs.ru/wiki/tls.md), прокси, cookies, загрузку файлов и аутентификацию. Для разработчика это главный инструмент проверки веб-сервисов и [REST](https://llmdocs.ru/wiki/rest.md)-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](https://llmdocs.ru/wiki/linux.md) он есть из коробки.

## Основы

```bash
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`) делает код выхода ненулевым при [кодах ответа](https://llmdocs.ru/wiki/http-status-codes.md) 400 и выше — без него скрипты в [Bash](https://llmdocs.ru/wiki/shell-bash.md) молча продолжают работу после сбоя.

## Работа с API

```bash
# 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](https://llmdocs.ru/wiki/json.md).[1]

## Диагностика

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

```bash
# время по фазам: 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](https://llmdocs.ru/wiki/dns.md), а `-v` показывает рукопожатие TLS и выбранный по ALPN протокол. Поддержка HTTP/3 зависит от того, с какой TLS-библиотекой собран curl.[5]

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

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

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

Wget удобнее для рекурсивной загрузки сайтов и докачки файлов; HTTPie и xh предлагают более дружелюбный синтаксис для API. В [Python](https://llmdocs.ru/wiki/python.md) ту же роль играют библиотеки requests и httpx, а многие из них умеют превращать запрос в эквивалентную команду curl — она стала универсальным языком описания HTTP-запросов в документации.

## См. также

- [HTTP](https://llmdocs.ru/wiki/http.md)
- [REST](https://llmdocs.ru/wiki/rest.md)
- [jq](https://llmdocs.ru/wiki/json.md)
- [TLS](https://llmdocs.ru/wiki/tls.md)
- [Коды состояния HTTP](https://llmdocs.ru/wiki/http-status-codes.md)

## Источники

1. [curl — man page](https://curl.se/docs/manpage.html)
2. [curl — History](https://curl.se/docs/history.html)
3. [Everything curl — книга Даниэля Стенберга](https://everything.curl.dev/)
4. [curl — License](https://curl.se/docs/copyright.html)
5. [curl — HTTP/3 support](https://curl.se/docs/http3.html)
6. [curl — SSL certificate verification](https://curl.se/docs/sslcerts.html)
