Как использовать curl для загрузки файлов из командной строки Linux
Команда Linux curl
может делать гораздо больше, чем загружать файлы. Узнайте, на что способен curl
и когда его следует использовать вместо wget
.
curl против wget: в чем разница?
Люди часто пытаются определить относительные преимущества команд wget
и curl
. Команды имеют некоторое функциональное дублирование. Каждый из них может извлекать файлы из удаленных мест, но на этом сходство заканчивается.
wget
— отличный инструмент для загрузки содержимого и файлов. Он может загружать файлы, веб-страницы и каталоги. Он содержит интеллектуальные подпрограммы для перехода по ссылкам на веб-страницах и рекурсивной загрузки контента со всего веб-сайта. Это непревзойденный менеджер загрузки из командной строки.
curl
удовлетворяет совершенно другую потребность. Да, он может извлекать файлы, но не может рекурсивно перемещаться по веб-сайту в поисках содержимого для извлечения. На самом деле curl
позволяет вам взаимодействовать с удаленными системами, отправляя запросы к этим системам, а также извлекая и отображая их ответы. Эти ответы вполне могут быть содержимым веб-страницы и файлами, но они также могут содержать данные, предоставленные через веб-службу или API в результате «вопроса», заданного запросом curl.
И curl
не ограничивается веб-сайтами. curl
поддерживает более 20 протоколов, включая HTTP, HTTPS, SCP, SFTP и FTP. И, возможно, благодаря превосходной обработке конвейеров Linux, curl
легче интегрировать с другими командами и сценариями.
У автора curl
есть веб-страница, на которой описаны различия, которые он видит между curl
и wget
.
Установка завитка
Из компьютеров, которые использовались для исследования этой статьи, на Fedora 31 и Manjaro 18.1.0 уже был установлен curl
. curl
нужно было установить на Ubuntu 18.04 LTS. В Ubuntu выполните эту команду, чтобы установить его:
sudo apt-get install curl
Версия завитка
Опция --version
заставляет curl
сообщать о своей версии. В нем также перечислены все протоколы, которые он поддерживает.
curl --version
Получение веб-страницы
Если мы укажем curl
на веб-страницу, он получит ее для нас.
curl https://www.bbc.com
Но его действие по умолчанию — выгрузить его в окно терминала как исходный код.
Осторожно: если вы не скажете curl
, что хотите сохранить что-то в виде файла, он всегда выгрузит это в окно терминала. Если файл, который он извлекает, является двоичным файлом, результат может быть непредсказуемым. Оболочка может попытаться интерпретировать некоторые значения байтов в двоичном файле как управляющие символы или управляющие последовательности.
Сохранение данных в файл
Скажем curl перенаправить вывод в файл:
curl https://www.bbc.com > bbc.html
На этот раз мы не видим полученную информацию, она отправляется прямо в файл для нас. Поскольку вывод окна терминала для отображения отсутствует, curl
выводит набор информации о ходе выполнения.
В предыдущем примере этого не было сделано, потому что информация о ходе выполнения была бы разбросана по всему исходному коду веб-страницы, поэтому curl
автоматически подавляла ее.
В этом примере curl
определяет, что выходные данные перенаправляются в файл и что генерировать информацию о ходе выполнения безопасно.
Предоставляемая информация:
- % Total: общая сумма, которую нужно получить.
- % полученных: процент и фактические значения данных, полученных на данный момент.
- % Xferd: процент и фактическое количество отправленных данных, если данные загружаются.
- Средняя скорость загрузки: средняя скорость загрузки.
- Средняя скорость загрузки: средняя скорость загрузки.
- Общее время: расчетная общая продолжительность передачи.
- Затраченное время: время, прошедшее с момента передачи.
- Осталось времени: примерное время, оставшееся до завершения переноса.
- Текущая скорость: текущая скорость передачи для данной передачи.
Поскольку мы перенаправили вывод из curl
в файл, теперь у нас есть файл с именем «bbc.html».
Двойной щелчок по этому файлу откроет браузер по умолчанию и отобразит полученную веб-страницу.
Обратите внимание, что адрес в адресной строке браузера является локальным файлом на этом компьютере, а не удаленным веб-сайтом.
Нам не нужно перенаправлять вывод для создания файла. Мы можем создать файл, используя параметр -o
(вывод) и указав curl
создать файл. Здесь мы используем параметр -o
и указываем имя файла, который мы хотим создать, «bbc.html».
curl -o bbc.html https://www.bbc.com
Использование индикатора выполнения для мониторинга загрузок
Чтобы текстовая информация о загрузке была заменена простым индикатором выполнения, используйте параметр -#
(индикатор выполнения).
curl -x -o bbc.html https://www.bbc.com
Перезапуск прерванной загрузки
Загрузку, которая была прервана или прервана, легко возобновить. Начнем загрузку большого файла. Мы будем использовать последнюю сборку долгосрочной поддержки Ubuntu 18.04. Мы используем параметр --output
, чтобы указать имя файла, в который мы хотим его сохранить: «ubuntu180403.iso».
curl --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso
Загрузка начинается и идет к завершению.
Если мы принудительно прервем загрузку с помощью Ctrl+C
, мы вернемся в командную строку, и загрузка будет прервана.
Чтобы возобновить загрузку, используйте параметр -C
(продолжить). Это заставляет curl
перезапустить загрузку в указанной точке или смещении в целевом файле. Если вы используете дефис -
в качестве смещения, curl
просмотрит уже загруженную часть файла и определит правильное смещение, которое будет использоваться для себя.
curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso
Загрузка перезапускается. curl
сообщает о смещении, с которого он перезапускается.
Получение заголовков HTTP
С опцией -I
(head) вы можете получать только заголовки HTTP. Это то же самое, что отправить команду HTTP HEAD на веб-сервер.
curl -I www.twitter.com
Эта команда извлекает только информацию; он не загружает веб-страницы или файлы.
Загрузка нескольких URL-адресов
Используя xargs
, мы можем загрузить несколько URL-адресов одновременно. Возможно, мы хотим загрузить серию веб-страниц, составляющих одну статью или учебник.
Скопируйте эти URL-адреса в редактор и сохраните их в файл с именем «urls-to-download.txt». Мы можем использовать xargs
для обработки содержимого каждой строки текстового файла как параметра, который он, в свою очередь, будет передавать в curl
.
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
передавал эти URL-адреса в curl
по одному:
xargs -n 1 curl -O < urls-to-download.txt
Обратите внимание, что эта команда использует команду вывода -O
(удаленный файл), которая использует заглавную букву «O». Этот параметр заставляет curl
сохранять полученный файл с тем же именем, что и файл на удаленном сервере.
Параметр -n 1
указывает xargs
обрабатывать каждую строку текстового файла как один параметр.
Когда вы запустите команду, вы увидите, что несколько загрузок начинаются и заканчиваются одна за другой.
Проверка в файловом браузере показывает, что несколько файлов были загружены. Каждый из них носит то же имя, что и на удаленном сервере.
Загрузка файлов с FTP-сервера
Использовать curl
с сервером протокола передачи файлов (FTP) очень просто, даже если вам нужно пройти аутентификацию с помощью имени пользователя и пароля. Чтобы передать имя пользователя и пароль с помощью curl
, используйте параметр -u
(user) и введите имя пользователя, двоеточие «:» и пароль. Не ставьте пробел перед или после двоеточия.
Это бесплатный для тестирования FTP-сервер, размещенный Rebex. На тестовом FTP-сайте предустановлено имя пользователя «demo» и пароль «password». Не используйте этот тип слабого имени пользователя и пароля на рабочем или «настоящем» FTP-сервере.
curl -u demo:password ftp://test.rebex.net
curl
определяет, что мы указываем на FTP-сервер, и возвращает список файлов, присутствующих на сервере.
Единственным файлом на этом сервере является файл «readme.txt» длиной 403 байта. Давайте извлечем его. Используйте ту же команду, что и минуту назад, с добавленным к ней именем файла:
curl -u demo:password ftp://test.rebex.net/readme.txt
Файл получен, и curl
отображает его содержимое в окне терминала.
Почти во всех случаях будет удобнее сохранить извлеченный файл на диск для нас, а не отображать в окне терминала. Еще раз мы можем использовать команду вывода -O
(удаленный файл), чтобы сохранить файл на диск с тем же именем, что и на удаленном сервере.
curl -O -u demo:password ftp://test.rebex.net/readme.txt
Файл извлекается и сохраняется на диск. Мы можем использовать ls
для проверки сведений о файле. Он имеет то же имя, что и файл на FTP-сервере, и такой же длины, 403 байта.
ls -hl readme.txt
Отправка параметров на удаленные серверы
Некоторые удаленные серверы будут принимать параметры в запросах, которые им отправляются. Параметры могут использоваться, например, для форматирования возвращаемых данных или для выбора точных данных, которые пользователь хочет получить. Часто можно взаимодействовать с интерфейсами программирования веб-приложений (API) с помощью curl
.
В качестве простого примера: на веб-сайте ipify есть API, к которому можно запросить ваш внешний IP-адрес.
curl https://api.ipify.org
Добавив в команду параметр format
со значением «json», мы снова можем запросить наш внешний IP-адрес, но на этот раз возвращаемые данные будут закодированы в формате JSON.
curl https://api.ipify.org?format=json
Вот еще один пример, в котором используется Google API. Он возвращает объект JSON, описывающий книгу. Параметр, который вы должны указать, — это международный стандартный книжный номер (ISBN) книги. Вы можете найти их на задней обложке большинства книг, обычно под штрих-кодом. Здесь мы будем использовать параметр «0131103628».
curl https://www.googleapis.com/books/v1/volumes?q=isbn:0131103628
Возвращаемые данные являются исчерпывающими:
Иногда завиток, иногда wget
Если бы я хотел загрузить контент с веб-сайта и выполнить рекурсивный поиск этого контента в древовидной структуре веб-сайта, я бы использовал wget
.
Если бы я хотел взаимодействовать с удаленным сервером или API и, возможно, загрузить некоторые файлы или веб-страницы, я бы использовал curl
. Особенно, если протокол был одним из многих, не поддерживаемых wget
.
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts