Гид по технологиям

curl в Linux: полное руководство

10 min read Linux Обновлено 05 Dec 2025
curl в Linux — руководство и примеры
curl в Linux — руководство и примеры

TL;DR

curl — универсальная утилита командной строки для выполнения сетевых запросов и передачи данных по множеству протоколов. Используйте curl для взаимодействия с API, передачи форм, скачивания одиночных файлов и автоматизации сетевых операций; используйте wget, когда нужно рекурсивно загрузить структуру сайта.

Быстрые ссылки

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

Открытый терминал Linux с запущенным curl.

Введение

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

Вывод curl --version в окне терминала

Этот вывод полезен для проверки поддержки TLS, библиотек SSL, а также наличия поддержки специфичных протоколов.

Получение веб-страницы с помощью curl

Чтобы получить содержимое веб-страницы, выполните:

curl https://www.bbc.com

По умолчанию curl выводит «сырой» исходный код страницы в терминал. Это удобно для быстрой проверки ответа сервера, но не для сохранения файла.

Вывод curl с исходным кодом веб-страницы в терминале

Важная деталь: если вы не перенаправите вывод в файл, то бинарные данные могут испортить ваш терминал. Для безопасного сохранения используйте перенаправление или опцию -o / -O.

Сохранение данных в файл

Простейший способ — перенаправить stdout:

curl https://www.bbc.com > bbc.html

При этом curl автоматически покажет индикатор прогресса, потому что вывод не идёт в терминал. Индикатор содержит такие значения, как процент загрузки, скорость и оценки времени.

Индикатор прогресса загрузки 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 явно указывает имя создаваемого файла.

curl -o bbc.html https://www.bbc.com в терминале

Совет: при скачивании бинарников лучше использовать опцию -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-запроса: вы получите только метаданные ответа сервера без тела.

Вывод curl -I www.twitter.com в терминале

Полезно для проверки статус-кодов, заголовков кеширования, типа контента и т. п.

Загрузка нескольких 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

Вывод xargs и curl при загрузке нескольких файлов

Подсказка: если нужно параллельно запускать скачивания, используйте 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.net

curl определит 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

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.

JSON-ответ от Google Books API в терминале

Отправка 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.

Таблица сравнения

Задачаcurlwget
Рекурсивная загрузка сайта
Работа с 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: безопасная загрузка больших файлов

  1. Проверить ссылку и поддержку Range: curl -I URL
  2. Скачивать с опциями: curl -L –fail -C - -o file.iso URL
  3. Проверить контрольную сумму после окончания: sha256sum file.iso
  4. При автоматизации избегать передачи паролей в командной строке.

Тестовые случаи и критерии приёмки

Критерии приёмки для задачи “скачать файл из URL”:

  • Запрос возвращает HTTP 200 или 206 при возобновлении.
  • Файл записан под ожидаемым именем и с ненулевым размером.
  • Проверка контрольной суммы успешна (если предоставлена).
  • Скрипт корректно обрабатывает таймауты и ошибки сети.

Тесты:

  • Попытка скачать несуществующий URL — curl должен вернуть ненулевой код.
  • Прерывание и возобновление загрузки — итоговый файл совпадает с исходным.
  • Параллельная загрузка списка url — все файлы скачаны и валидны.

Безопасность и конфиденциальность

  • Не передавайте пароли в аргументах командной строки в продуктиве.
  • Используйте переменные окружения, файлы .netrc с правами 600 или специальные менеджеры секретов.
  • Для передачи персональных данных соблюдайте требования локального законодательства и GDPR-практики: минимизируйте передаваемые поля, используйте HTTPS.
  • Избегайте –insecure (-k) в продуктиве.

Советы по миграции и совместимости

  • Если скрипты использовали wget для одиночных скачиваний и вы хотите перейти на curl, проверьте поведение по умолчанию для редиректов и кодов ошибок.
  • curl возвращает ошибку при –fail на 4xx/5xx, wget может сохранять тело с ошибкой.

Распространённые сценарии (галерея крайних случаев)

  1. Сервер не поддерживает Range: продолжение загрузки невозможно — curl начнёт скачивать файл с нуля.
  2. Нестандартный порт или протокол (sftp://, scp://): curl поддержит, wget — возможно нет.
  3. API требует CSRF-токен: сначала получите токен, затем включите его в заголовок следующего запроса.
  4. Ограничение скорости на сервере: используйте –limit-rate для контроля пропускной способности.
curl --limit-rate 500K -O http://example.com/largefile.iso

Альтернативные инструменты и когда их выбрать

  • wget — для рекурсивных загрузок и зеркалирования сайтов.
  • aria2 — для многопоточных загрузок и ускорения больших файлов.
  • rclone — для синхронизации облачных хранилищ.

Принципиальные эвристики при выборе

  • Простота: wget для «скачать сайт», curl для «сделать HTTP-запрос».
  • Контроль: если нужны заголовки, метод и тело — curl.
  • Масштаб: для параллельных и распределённых загрузок — aria2 или rclone.

Краткая методология автоматизации

  1. Определите требования: один файл или множество; нужен ли API-вызов.
  2. Выберите инструмент: wget/curl/aria2.
  3. Тестируйте в интерактивном режиме с -v и –trace.
  4. Автоматизируйте с обработкой ошибок и возвратных кодов.
  5. Логируйте и проверяйте контрольные суммы.

Как читать вывод 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 — протокол передачи гипертекста.

bbc.html файл, созданный curl, показанный в файловом менеджере.

Полученная веб-страница, отображённая в окне браузера (локальный файл).

Содержимое файла, полученного с FTP-сервера, показано в терминале.

Список загруженных файлов в файловом менеджере Nautilus.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Преобразование типов в C# — Parse, TryParse, Convert
C++

Преобразование типов в C# — Parse, TryParse, Convert

Ошибка DoorDash 400: как исправить на телефоне
Техподдержка

Ошибка DoorDash 400: как исправить на телефоне

Автоматизация Excel: Python + openpyxl
Инструменты

Автоматизация Excel: Python + openpyxl

Потоки в C/C++ на Linux с pthread
Linux C/C++

Потоки в C/C++ на Linux с pthread

Как выключить iPhone 14: быстро и просто
Гайды

Как выключить iPhone 14: быстро и просто

Счётчик слов на JavaScript — простой пример
Web‑разработка

Счётчик слов на JavaScript — простой пример