Как использовать cURL для передачи данных через командную строку и не только

Справочник по командам Curl

Если вы какое-то время следили за инструкциями по установке программ в формате терминала для Linux, вы, вероятно, уже сталкивались с командой curl. cURL — это инструмент командной строки для передачи данных с URL-адресами. Одним из самых простых способов его использования является загрузка файла через командную строку. Однако это обманчиво, так как cURL является невероятно мощным инструментом, способным на гораздо большее.

Содержание

  • Что такое cURL?
  • Установка
  • Использование cURL
  • Следование за перенаправлениями
  • Возобновление загрузки
  • Загрузка более чем одного файла
  • Загрузка с аутентификацией
  • Разделение и объединение файлов
  • Другие полезные функции
  • cURL против Wget
  • Часто задаваемые вопросы
  • Подведение итогов

Также прочитайте: Как копировать и вставлять текст, файлы и папки в терминале Linux

Что такое cURL?

Изначально написанная Даниэлем Стернбергом в 1996 году для получения финансовых данных с веб-серверов и их трансляции в каналы IRC, cURL эволюционировала в мощный инструмент для получения данных без необходимости использования браузера. Если вы постоянно используете терминал, это будет одним из более важных инструментов в вашем арсенале.

В большинстве дистрибутивов Linux cURL предустановлен в системе, и вы можете использовать его сразу. Даже если он не установлен, он также есть в большинстве репозиториев, поэтому вы можете легко установить его с помощью Центра программного обеспечения.

Для Windows нет команды «похожей на cURL», а в macOS cURL предустановлен, но не предлагает такого же количества флагов, как версия для Linux.

Также прочитайте: Как использовать команду dd в Linux

Установка

Прежде чем мы продолжим, мы должны убедиться, что cURL уже установлен в нашей системе.

Linux

В дистрибутивах на основе Debian/Ubuntu используйте следующую команду для установки cURL:

sudo apt install curl

В дистрибутивах на основе Arch:

sudo pacman -S curl

В Fedora/CentOS/RHEL:

sudo dnf install curl

macOS

Для macOS он уже предустановлен, так что вам ничего не нужно делать.

Также прочитайте: Как запустить терминал в текущем местоположении папки на Mac

Windows

  1. Для Windows 7/10/11 перейдите на страницу загрузки cURL и выберите 64-битный или 32-битный пакет в зависимости от вашей архитектуры. Если вы не знаете свою архитектуру, 64-битный вариант — это безопасный выбор, так как подавляющее большинство аппаратного обеспечения, выпущенного после 2006 года, использует его.
  2. Создайте папку либо прямо на системном диске, либо в «C:\Program Files\» и назовите ее «cURL».

Linuxcurl Новаяпапка

  1. Вернитесь к загруженному ZIP-файлу, откройте его и найдите «curl.exe» внутри папки «bin». Скопируйте его в созданную вами папку cURL. Скопированный EXE является полностью автономным и способен выполнять каждую комбинацию, которую вы можете запустить в Linux.
  2. Чтобы эта команда была действительно полезной, нам нужно добавить ее в переменную PATH в Windows, чтобы она могла запускаться из командной строки не зависимо от каталога.
  • Щелкните по меню «Пуск», введите environment и нажмите Enter.
  • Щелкните по «Переменные среды…». Теперь вы находитесь в настройках переменных среды.

Linuxcurl Переменныесреды

  • Выберите переменную среды «Path», затем щелкните «Изменить…».

  • Оказавшись в окне редактирования пути, нажмите «Создать» и введите каталог, в котором находится «curl.exe», — например, «C:\Program Files\cURL».

  • Нажмите «ОК» в окнах диалогов, которые вы открыли во время этого процесса, и наслаждайтесь использованием cURL в своем терминале!

Каждый флаг в cURL, который доступен в Linux, должен работать в версии для Windows.

Совет: помните, что командный процессор никогда не следует путать с терминалом Windows. Терминал Windows поставляется со своей версией cURL, которая входит в PowerShell и выполняет аналогичную функциональность, но работает совершенно иначе.

Также прочитайте: Как использовать команду rm в Linux

Использование cURL

Чтобы начать, просто введите curl maketecheasier.com в своем терминале и нажмите Enter.

Если вы не получаете никакого вывода, это потому, что сервер этого сайта не настроен для ответа на случайные подключения к своему домену без www. Если бы вы опросили сервер, которого не существует или который не в сети, вы получили бы сообщение об ошибке, сообщающее, что cURL не может разрешить хост.

Чтобы cURL выполнил что-то действительно полезное, нам нужно будет указать протокол. В нашем примере мы используем протокол HTTPS для запроса главной страницы этого сайта. Введите curl https://www.maketecheasier.com.

Linuxcurl Файлы

Если все пройдет успешно, вы должны увидеть огромный поток данных. Чтобы сделать эти данные более удобными, мы можем сказать cURL сохранить их в HTML-файл:

curl https://www.maketecheasier.com > ~/Downloads/mte.html

Эта команда помещает содержание вывода нашего сайта в HTML-файл в вашей папке «Загрузки». Перейдите к папке с помощью вашего любимого файлового менеджера и дважды щелкните по только что созданному файлу. Он должен открыть снимок HTML-вывода главной страницы этого сайта.

Аналогично, вы можете использовать флаг -o, чтобы добиться того же результата:

curl -o ~/Downloads/mte.html https://www.maketecheasier.com

Следование за перенаправлениями

Большинство сайтов автоматически перенаправляют трафик с протокола «http» на «https». В cURL вы можете добиться того же с помощью флага -L. Это автоматически будет следовать за 301 перенаправлениями, пока не достигнет читаемой страницы или файла.

 curl -L http://google.com.

Linuxcurl Перенаправление

Возобновление загрузки

При загрузке больших файлов, в зависимости от вашей скорости интернета, перерывы могут быть чрезвычайно раздражающими. К счастью, cURL имеет функцию возобновления. Использование флага -C быстро решит эту проблему.

Чтобы показать реальный пример, я намеренно прервал загрузку файла ISO тестовой версии Debian, нажав Ctrl и C в процессе загрузки.

Linuxcurl Прервана

Для нашей следующей команды мы добавим флаг -C. Например,

curl -C - -o ~/Downloads/debiantesting.iso -L https://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-dvd/debian-testing-amd64-DVD-1.iso

Linuxcurl Возобновление

Загрузка успешно начнется с того места, где она была прервана.

Загрузка более чем одного файла

Поскольку cURL не имеет самого интуитивного способа загрузки нескольких файлов, есть два метода, каждый из которых имеет свои компромиссы.

Если файлы, которые вы загружаете, пронумерованы (например, file1, file2 и так далее), вы можете использовать скобки, чтобы получить полный диапазон файлов, и использовать «#» в выводе, который вы указываете с флагом -o. Чтобы сделать это немного более понятным, вот пример:

curl "http://example.com/file[1-5].zip"-o"#1_#2"

Более простой способ сделать это — использовать -O (--remote-name). Этот флаг заставляет cURL загружать удаленный файл на локальный файл с таким же именем. Поскольку вам не нужно указывать вывод, вы должны использовать эту команду, когда терминал открыт в каталоге, куда хотите загрузить файлы.

curl -O"https://example.com/file1.zip"-O"https://example.com/file2.zip"

Если у вас есть много пронумерованных файлов для загрузки, флаг --remote-name-all будет лучшим вариантом:

curl --remote-name-all"https://example.com/file[1-5].zip"

Вы даже можете указать неперечисленные файлы, приходящие с того же сайта, без необходимости повторно вводить URL, используя скобки:

curl --remote-name-all"https://example.com/{file1.zip,anotherfile.zip,thisisfun.zip}"

Загрузка с аутентификацией

Чтобы загружать файлы, которые требуют аутентификации (например, при загрузке с частного FTP-сервера), используйте флаг -u. Каждое аутентификационное обращение должно вводить сначала имя пользователя, а затем пароль, разделенные двоеточием. Вот пример для простоты:

curl -u username:password -o ~/Downloads/file.zip ftp://example.com/file.zip

Это аутентифицирует нашего друга bonobo_bob на FTP-сервере и скачает файл в папку «Загрузки».

Разделение и объединение файлов

Если по какой-либо причине вы хотите скачать большой файл и разделить его на части, вы можете сделать это с помощью флага --range в cURL. С --range вы должны указать байт, с которого хотите начать, до байта, который хотите закончить. Если вы не укажете конец диапазона, он просто загрузит оставшуюся часть файла.

В команде ниже cURL загрузит первые 100 МБ образа установки Arch Linux:

curl --range0-99999999-o arch.part1 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso

Для следующих 100 МБ используйте --range 100000000-199999999 и так далее. Вы можете объединить эти команды, используя оператор &&:

curl --range0-99999999-o arch.part1 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \  
curl --range100000000-199999999-o arch.part2 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \  
curl --range200000000-299999999-o arch.part3 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \  
curl --range300000000-399999999-o arch.part4 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \  
curl --range400000000-499999999-o arch.part5 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \  
curl --range500000000-599999999-o arch.part6 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \  
curl --range600000000-699999999-o arch.part7 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \  
curl --range700000000- -o arch.part8 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso

Если вы следовали этой структуре команд, то восемь файлов должны появиться в том месте, где вы попросили cURL их загрузить.

Чтобы объединить эти файлы, вам нужно будет использовать команду cat, если вы находитесь на Linux или macOS, вот так:

cat arch.part? > arch.iso

Для Windows вам нужно будет использовать команду copy так:

copy/b arch.part* arch.iso

Другие полезные функции

Существует множество флагов и функций для cURL:

  • -# – Использует индикатор прогресса, чтобы показать, как далеко вы продвинулись в загрузке. Пример: curl -# https://asite.com/somefile.zip > ~/somefile.zip.
  • -a – Просит cURL добавлять данные в файл, а не перезаписывать его. Пример: curl -ao ~/collab-full.x https://example-url.com/collab-part26.x.
  • --head – Получает только заголовок ответа от сервера без выходных данных. Это полезно, когда вы либо отлаживаете веб-сайт, либо просматриваете зависимые от клиента ответы сервера. Пример: curl --head https://example-url.com.
  • --limit-rate – Заказывает загрузку с ограниченной пропускной способностью. Это полезно в ситуациях, когда вы не хотите, чтобы cURL захватывал всю доступную пропускную способность в вашей системе. Простое число будет интерпретировано как байты в секунду. K обозначает килобайты в секунду; М обозначает мегабайты в секунду. Пример: curl --limit-rate 8M https://example-url.com/file.zip > ~/file.zip.
  • -o – Как упоминалось ранее, определяет выходной файл, который cURL должен использовать. Пример: curl -o ~/Downloads/file.zip https://thefileplace.com/file.zip -o file2.zip https://thefileplace.com/file2.zip.
  • --proxy – Если вы хотите работать с прокси, это способ сделать это. Пример: curl --proxy proxyurl:port https://example-url.com/file.zip > ~file.zip.

cURL против Wget

Оба были выпущены в одном и том же году (1996), cURL и Wget практически являются сестринскими программами для случайного наблюдателя. Но при более глубоком рассмотрении вы можете увидеть, что у этих двух сестер разные цели.

Wget

  • Полностью построен с нуля, чтобы захватывать данные из Интернета.
  • Не требует флагов -L или -o, как cURL; просто введите wget [url] и вперед!
  • Можете загружать рекурсивно, чтобы захватить все в каталоге с флагом -r.
  • Имеет все функции, необходимые пользователю для повседневного использования, и ориентирован на повседневные задачи системного администратора.
  • (В Linux) Не требует много зависимостей; все они должны быть доступны «из коробки».

Также прочитайте: Как установить и использовать wget на Mac

cURL

  • Обширный репертуар флагов и полезных функций для удаленного извлечения.
  • Поддерживает локальные сети (LDAP) и сетевые принтеры (Samba).
  • Хорошо работает с библиотеками сжатия gzip.
  • Зависит от libcurl, что позволяет разработчикам писать программы или bash-скрипты, которые включают функциональность cURL.

В кратце, Wget — это «инструмент для простых пользователей» для получения данных из Интернета, в то время как cURL расширяет эти возможности более детальным контролем для продвинутых пользователей и системных администраторов.

Часто задаваемые вопросы

1. У меня ошибка сертификата в Linux. Как это исправить?

Если вы получили ошибку, которая говорит что-то вроде «издатель сертификата узла не доверен», самый простой способ это исправить — переустановить пакет общих сертификатов в вашем дистрибутиве.

Для систем на основе Debian/Ubuntu:

sudo apt reinstall ca-certificates

Для Fedora/CentOS/RHEL:

dnf reinstall ca-certificates

Для систем на основе Arch:

pacman -S ca-certificates

Обратите внимание, что в Arch вы, возможно, захотите очистить кеш пакетов с помощью pacman -Scc перед переустановкой пакета сертификатов.

Если вы все еще получаете эту ошибку, возможно, что-то не так с сервером.

2. Безопасно ли запускать команды cURL и bash вместе?

Хотя это не самый распространенный способ установки Linux-программ, есть немало разработчиков (например, люди, стоящие за NodeJS), которые не оставляют вам выбора, кроме как использовать curl вместе с командой root-доступа, которая выполняется через bash (например, curl [аргумент] | sudo -E bash -) для установки программы.

Это может выглядеть немного страшно, но если люди, стоящие за приложением, заслуживают доверия, маловероятно, что вы что-то сломаете. Злоумышленники повсюду и могут проникать в репозитории, такие как AUR Arch, поэтому установка с использованием curl в сочетании с командами root-доступа не является в общем менее безопасной, чем это было бы через ваш менеджер пакетов.

3. Могу ли я использовать cURL с Tor?

Да! Запустите Tor Browser (или отдельный сервис Tor) и используйте флаг --proxy. Tor предоставляет вам локальный прокси, который вы можете использовать для маскировки вашего IP в других приложениях. Вот пример использования cURL с Tor:

curl --proxy localhost:9050 http://example.com

Отдельные сервисы Tor будут использовать порт 9050 для прослушивания, в то время как Tor Browser использует порт 9150.

Подведение итогов

cURL оказалась стойкой среди меняющихся реалий мира Linux, сохраняя свою позицию важного инструмента в арсенале пользователей терминала.

Если вы новичок в командной строке, посмотрите на одни из самых полезных команд Linux. Если вы просто хотите искать в Интернете, а не загружать данные, вы также можете просматривать веб-страницы через терминал.