curl в Linux: полное руководство
TL;DR
curl — универсальная утилита командной строки для выполнения сетевых запросов и передачи данных по множеству протоколов. Используйте curl для взаимодействия с API, передачи форм, скачивания одиночных файлов и автоматизации сетевых операций; используйте wget, когда нужно рекурсивно загрузить структуру сайта.
Быстрые ссылки
- curl vs. wget : В чём разница?
- Как установить curl
- Версия curl
- Получение веб-страницы с помощью curl
- Сохранение данных в файл
- Индикатор прогресса при загрузках
- Возобновление прерванной загрузки
- Получение HTTP-заголовков
- Загрузка нескольких URL
- Загрузка файлов с FTP-сервера
- Отправка параметров на удалённые серверы
- Когда использовать curl, а когда wget

Введение
curl — это инструмент для выполнения сетевых запросов из командной строки. Одной строкой можно скачать файл, отправить POST-запрос, получить заголовки ответа сервера или интегрировать запросы в скрипт. Простая идея: curl отправляет запрос и показывает ответ. Определение: HTTP — протокол передачи гипертекста; API — интерфейс для программного взаимодействия по сети.
Важно: curl поддерживает более 20 протоколов (HTTP, HTTPS, FTP, SFTP, SCP и др.). Он хорош там, где требуется точный контроль над запросом и обработка ответа, особенно в пайпах и скриптах.
curl vs. wget : В чём разница?
wget и curl пересекаются по базовой задаче — скачиванию данных из сети, но их назначение разное:
- wget оптимизирован для массовых загрузок и рекурсивного обхода сайта. Он действует как менеджер загрузок и удобен для зеркалирования сайтов.
- curl ориентирован на взаимодействие с удалёнными сервисами и API. Он гибко формирует HTTP-заголовки, поддерживает разные методы (GET, POST, PUT, DELETE) и легко встраивается в конвейеры обработки через пайпы.
Ментальная модель: если задача — «скачать много файлов по ссылкам, поддерживая структуру сайта», выбирайте wget. Если нужно «сформировать HTTP-запрос, получить и обработать ответ», выбирайте curl.
Когда curl предпочтителен:
- Работа с REST/GraphQL API.
- Автоматизация запросов с заголовками, куки и аутентификацией.
- Поддержка нестандартных протоколов (SFTP, SCP).
- Интеграция с jq, sed, awk и другими утилитами через пайпы.
Когда wget предпочтителен:
- Рекурсивное скачивание сайта.
- Простые массовые загрузки без сложной обработки ответа.
Примечание: автор curl поддерживает страницу с собственными замечаниями о разнице между curl и wget.
Как установить curl
curl обычно присутствует в популярных дистрибутивах Linux, но если его нет, установите через пакетный менеджер.
На Debian/Ubuntu:
sudo apt-get install curlНа Fedora и Arch curl часто уже установлен. Для других дистрибутивов используйте соответствующий менеджер пакетов: yum, dnf, pacman и т. д.
Версия curl
Проверьте версию и список поддерживаемых протоколов:
curl --version
Этот вывод полезен для проверки поддержки TLS, библиотек SSL, а также наличия поддержки специфичных протоколов.
Получение веб-страницы с помощью curl
Чтобы получить содержимое веб-страницы, выполните:
curl https://www.bbc.comПо умолчанию curl выводит «сырой» исходный код страницы в терминал. Это удобно для быстрой проверки ответа сервера, но не для сохранения файла.

Важная деталь: если вы не перенаправите вывод в файл, то бинарные данные могут испортить ваш терминал. Для безопасного сохранения используйте перенаправление или опцию -o / -O.
Сохранение данных в файл
Простейший способ — перенаправить stdout:
curl https://www.bbc.com > bbc.htmlПри этом curl автоматически покажет индикатор прогресса, потому что вывод не идёт в терминал. Индикатор содержит такие значения, как процент загрузки, скорость и оценки времени.

Пояснение полей индикатора:
- % Total — общий объём данных.
- % Received — сколько получено.
- % Xferd — сколько отправлено (при upload).
- Average Speed Dload / Upload — средняя скорость.
- Time Total / Spent / Left — оценки по времени.
- Current Speed — текущая скорость.
Альтернатива перенаправлению — опция -o:
curl -o bbc.html https://www.bbc.comОпция -o явно указывает имя создаваемого файла.

Совет: при скачивании бинарников лучше использовать опцию -L для следования редиректам и –fail чтобы получить ненулевой код возврата при ошибке HTTP.
curl -L --fail -o archive.zip https://example.com/archive.zipИндикатор прогресса в виде полосы
Чтобы заменить текстовый индикатор простым прогресс-баром, используйте опцию -#:
curl -# -o bbc.html https://www.bbc.comПримечание: исходная статья содержит опечатку -x вместо -#; правильный флаг для прогресс-бара — -#.
Возобновление прерванной загрузки
curl умеет продолжать прерванные загрузки через опцию -C. Практический пример — загрузка большого .iso-файла:
curl --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.isoЕсли вы прервали загрузку (Ctrl+C), повторите команду с -C -:
curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.isoОпция -C - говорит curl определить смещение автоматически по уже загруженной части файла.

Ограничение: сервер должен поддерживать заголовок Range для корректного продолжения. Если сервер не поддерживает, придётся перекачивать файл полностью.
Получение HTTP-заголовков
Для запроса только HTTP-заголовков используйте -I:
curl -I www.twitter.comЭто аналог HTTP HEAD-запроса: вы получите только метаданные ответа сервера без тела.

Полезно для проверки статус-кодов, заголовков кеширования, типа контента и т. п.
Загрузка нескольких URL
Чтобы массово скачать набор URL, подготовьте файл со списком и используйте xargs вместе с curl.
Создайте файл urls-to-download.txt со списком адресов (по одному в строке). Затем:
xargs -n 1 curl -O < urls-to-download.txtОпция -O (заглавная O) сохраняет файл под оригинальным именем, указанным на сервере. Флаг -n 1 заставляет xargs передавать по одному URL за раз.
Пример содержимого urls-to-download.txt:
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#0
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#1
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#2
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#3
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#4
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#5
Подсказка: если нужно параллельно запускать скачивания, используйте GNU Parallel или xargs -P.
cat urls-to-download.txt | xargs -n 1 -P 4 curl -OЭто запустит до 4 параллельных загрузок.
Загрузка файлов с FTP-сервера
curl работает с FTP и поддерживает передачу учётных данных через -u:
curl -u demo:password ftp://test.rebex.netcurl определит FTP-протокол и покажет список файлов. Чтобы скачать конкретный файл:
curl -u demo:password ftp://test.rebex.net/readme.txtДля сохранения на диск используйте -O:
curl -O -u demo:password ftp://test.rebex.net/readme.txtПроверьте результат:
ls -hl readme.txt
Внимание к безопасности: не передавайте пароли в командной строке в продуктивных системах, поскольку они могут попасть в историю команд или в список процессов. Используйте .netrc, переменные окружения, либо интерактивный ввод.
Отправка параметров на удалённые серверы
curl легко формирует URL с параметрами GET:
curl https://api.ipify.orgЭто возвращает ваш внешний IP в виде текста. Для ответа в JSON добавьте параметр format:
curl https://api.ipify.org?format=jsonДля запросов к API с параметрами используйте URL-кодирование значений или опцию –data-urlencode.
Пример запроса к Google Books API по ISBN:
curl https://www.googleapis.com/books/v1/volumes?q=isbn:0131103628Результат — JSON со множеством полей, которые удобно парсить jq.

Отправка POST-запросов и JSON
Для отправки формы или JSON используйте –data / –data-raw / -d и указывайте заголовок Content-Type:
curl -X POST -H "Content-Type: application/json" -d '{"name":"Alice"}' https://api.example.com/usersПримечание: curl автоматически использует метод POST при наличии –data.
Чтобы отправить multipart/form-data (файлы), используйте -F:
curl -F "file=@./photo.jpg" -F "name=alice" https://api.example.com/uploadЗаголовки, куки и аутентификация
- Добавить произвольный заголовок: -H “Header: value”.
- Передать куки: –cookie “name=value” или –cookie-jar/–cookie для сохранения и загрузки.
- Базовая аутентификация: -u username:password (HTTP Basic).
- Bearer-токен: -H “Authorization: Bearer TOKEN”.
Пример:
curl -H "Authorization: Bearer $TOKEN" -H "Accept: application/json" https://api.example.com/dataОтладка и подробные логи
- -v или –verbose включает подробный вывод (заголовки, TLS-рукопожатие и т. п.).
- –trace и –trace-ascii дают расширенный дамп запроса/ответа в файл.
curl -v -H "Accept: application/json" https://api.example.com/dataИспользование curl в пайпах и с jq
curl хорошо сочетается с jq для обработки JSON:
curl -s https://api.example.com/data | jq '.items[] | {id: .id, title: .title}'Флаг -s (silent) подавляет прогресс и ошибокый вывод, чтобы не мешать парсингу.
Практические советы и часто встречающиеся ошибки
- Всегда проверяйте код возврата ($?). При ошибках учитывайте –fail.
- Для передачи секретов используйте переменные окружения, netrc или менеджер секретов.
- Если команда «виснет», попробуйте –connect-timeout и –max-time.
- Для HTTPS добавьте -k или –insecure только при тестировании.
Когда использовать curl, а когда wget
Если нужен контроль над HTTP-методами, заголовками, телом запроса и интеграция с API — curl. Если нужно зеркалирование сайта или рекурсивная загрузка — wget.
Таблица сравнения
| Задача | curl | wget |
|---|---|---|
| Рекурсивная загрузка сайта | ❌ | ✅ |
| Работа с API и заголовками | ✅ | частично |
| Поддержка протоколов (SFTP, SCP) | ✅ | ограниченно |
| Интеграция в скрипты/пайпы | ✅ | ✅ |
| Управление куками | ✅ | ✅ |
| Возобновление загрузок | ✅ | ✅ |
Чеклист ролей
Разработчик:
- Использовать -s с jq для парсинга JSON.
- Логировать HTTP-коды и тело ошибок.
- Хранить токены в переменных окружения.
Системный администратор / DevOps:
- Проверять поддержку Range для возобновления загрузок.
- Автоматизировать тесты доступности с помощью curl -I.
- Использовать –max-time для таймаутов в cron.
QA-инженер:
- Писать тесты API с curl и сравнивать ответы с ожидаемыми.
- Использовать –trace для отладки нестабильных ответов.
Шпаргалка по часто используемым опциям
- -o <файл> — сохранить в указанный файл.
- -O — сохранить с именем на сервере.
- -L — следовать 3xx редиректам.
- -I — показать только заголовки.
- -s — тихий режим.
- -S — показывать ошибки даже в тихом режиме.
- -v — подробный вывод.
- -u user:pass — имя пользователя и пароль (FTP/HTTP basic).
- -C - — продолжить загрузку.
- -# — прогресс-бар.
- -H “Header: value” — добавить заголовок.
- -d/–data — отправить данные (POST).
Мини-SOP: безопасная загрузка больших файлов
- Проверить ссылку и поддержку Range: curl -I URL
- Скачивать с опциями: curl -L –fail -C - -o file.iso URL
- Проверить контрольную сумму после окончания: sha256sum file.iso
- При автоматизации избегать передачи паролей в командной строке.
Тестовые случаи и критерии приёмки
Критерии приёмки для задачи “скачать файл из URL”:
- Запрос возвращает HTTP 200 или 206 при возобновлении.
- Файл записан под ожидаемым именем и с ненулевым размером.
- Проверка контрольной суммы успешна (если предоставлена).
- Скрипт корректно обрабатывает таймауты и ошибки сети.
Тесты:
- Попытка скачать несуществующий URL — curl должен вернуть ненулевой код.
- Прерывание и возобновление загрузки — итоговый файл совпадает с исходным.
- Параллельная загрузка списка url — все файлы скачаны и валидны.
Безопасность и конфиденциальность
- Не передавайте пароли в аргументах командной строки в продуктиве.
- Используйте переменные окружения, файлы .netrc с правами 600 или специальные менеджеры секретов.
- Для передачи персональных данных соблюдайте требования локального законодательства и GDPR-практики: минимизируйте передаваемые поля, используйте HTTPS.
- Избегайте –insecure (-k) в продуктиве.
Советы по миграции и совместимости
- Если скрипты использовали wget для одиночных скачиваний и вы хотите перейти на curl, проверьте поведение по умолчанию для редиректов и кодов ошибок.
- curl возвращает ошибку при –fail на 4xx/5xx, wget может сохранять тело с ошибкой.
Распространённые сценарии (галерея крайних случаев)
- Сервер не поддерживает Range: продолжение загрузки невозможно — curl начнёт скачивать файл с нуля.
- Нестандартный порт или протокол (sftp://, scp://): curl поддержит, wget — возможно нет.
- API требует CSRF-токен: сначала получите токен, затем включите его в заголовок следующего запроса.
- Ограничение скорости на сервере: используйте –limit-rate для контроля пропускной способности.
curl --limit-rate 500K -O http://example.com/largefile.isoАльтернативные инструменты и когда их выбрать
- wget — для рекурсивных загрузок и зеркалирования сайтов.
- aria2 — для многопоточных загрузок и ускорения больших файлов.
- rclone — для синхронизации облачных хранилищ.
Принципиальные эвристики при выборе
- Простота: wget для «скачать сайт», curl для «сделать HTTP-запрос».
- Контроль: если нужны заголовки, метод и тело — curl.
- Масштаб: для параллельных и распределённых загрузок — aria2 или rclone.
Краткая методология автоматизации
- Определите требования: один файл или множество; нужен ли API-вызов.
- Выберите инструмент: wget/curl/aria2.
- Тестируйте в интерактивном режиме с -v и –trace.
- Автоматизируйте с обработкой ошибок и возвратных кодов.
- Логируйте и проверяйте контрольные суммы.
Как читать вывод curl — быстрые подсказки
- HTTP/1.1 200 OK — тело присутствует и успешно.
- HTTP/1.1 206 Partial Content — сервер поддерживает Range.
- TLS handshake errors — проверьте сертификаты и версии протоколов.
- Connection timed out — используйте –connect-timeout и –max-time.
Решающее дерево (Mermaid)
flowchart TD
A[Нужно скачать данные?] --> B{Нужно рекурсивно обходить сайт?}
B -- Да --> C[wget]
B -- Нет --> D{Нужно работать с API / заголовками / аутентификацией?}
D -- Да --> E[curl]
D -- Нет --> F{Нужно многопоточное скачивание?}
F -- Да --> G[aria2]
F -- Нет --> EЗаключение
curl — мощный и гибкий инструмент для работы с сетью из командной строки. Он незаменим при взаимодействии с API, в автоматизации и в сценариях, где важен контроль над заголовками и методом запроса. Для зеркалирования сайтов и рекурсивных загрузок лучше подходит wget, а для ускорения многопоточных загрузок — aria2.
Важно: в продакшне учитывайте безопасное хранение секретов, обработку ошибок и проверку целостности загружаемых файлов.
Краткое резюме
- curl хорош для API, а wget — для рекурсивных скачиваний.
- Используйте -o/-O, -L, -C -, -I и -H в зависимости от задачи.
- Не передавайте пароли в командной строке в продуктиве.
- Интегрируйте curl с jq и другими утилитами для автоматической обработки ответов.
Полезные ссылки
- Официальная документация curl — https://curl.se/
- Руководство по wget — используйте man wget
Однострочный глоссарий
- curl — утилита командной строки для передачи данных по сети.
- wget — утилита для загрузки файлов и зеркалирования сайтов.
- API — интерфейс для программного взаимодействия по сети.
- HTTP — протокол передачи гипертекста.




Похожие материалы
Преобразование типов в C# — Parse, TryParse, Convert
Ошибка DoorDash 400: как исправить на телефоне
Автоматизация Excel: Python + openpyxl
Потоки в C/C++ на Linux с pthread
Как выключить iPhone 14: быстро и просто