Як використовувати curl для завантаження файлів з командного рядка Linux

Команда Linux curl може зробити набагато більше, ніж завантажувати файли. Дізнайтеся, на що здатний curl і коли вам слід використовувати його замість wget.

curl проти wget: в чому різниця?

Людям часто важко визначити відносні переваги команд wget і curl. Команди мають деяке функціональне перекриття. Кожен із них може отримувати файли з віддалених місць, але на цьому подібність закінчується.

wget – це a фантастичний інструмент для завантаження вмісту та файлів. Він може завантажувати файли, веб-сторінки та каталоги. Він містить інтелектуальні підпрограми для проходження посилань на веб-сторінках і рекурсивного завантаження вмісту на всьому веб-сайті. Він неперевершений як менеджер завантажень командного рядка.

локон задовольняє зовсім інша потреба. Так, він може отримувати файли, але не може рекурсивно переміщатися по веб-сайту, шукаючи вміст для отримання. Насправді curl дозволяє вам взаємодіяти з віддаленими системами, надаючи запити до цих систем, а також отримувати та відображати їх відповіді вам. Ці відповіді можуть бути вмістом і файлами веб-сторінки, але вони також можуть містити дані, надані через веб-сервіс або API в результаті «запитання», заданого запитом curl.

І curl не обмежується лише веб-сайтами. curl підтримує понад 20 протоколів, включаючи HTTP, HTTPS, SCP, SFTP і FTP. І, можливо, завдяки чудовій обробці каналів Linux, curl можна легше інтегрувати з іншими командами та сценаріями.

Автор curl має веб-сторінку, яка описує відмінності, які він бачить між curl і wget.

Установка curl

З комп’ютерів, які використовувалися для дослідження цієї статті, у Fedora 31 і Manjaro 18.1.0 уже було встановлено curl. curl потрібно було встановити на Ubuntu 18.04 LTS. В Ubuntu виконайте цю команду, щоб встановити її:

sudo apt-get install curl

Версія локонів

Параметр –version робить curlreport своєю версією. У ньому також перераховані всі протоколи, які він підтримує.

curl --version

Отримання веб-сторінки

Якщо ми наведемо curl на веб-сторінку, він отримає її для нас.

curl https://www.bbc.com

Але його дія за замовчуванням полягає в тому, щоб скинути його у вікно терміналу як вихідний код.

  Як відновити втрачені дані в Linux

Обережно: якщо ви не скажете curl, що хочете, щоб щось було збережено у вигляді файлу, він завжди скидає його у вікно терміналу. Якщо файл, який він отримує, є двійковим, результат може бути непередбачуваним. Оболонка може спробувати інтерпретувати деякі значення байтів у двійковому файлі як керуючі символи або escape-послідовності.

Збереження даних у файл

Давайте скажемо curl перенаправити вихід у файл:

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

curl https://www.bbc.com > bbc.html у вікні терміналу” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Цього разу ми не бачимо отриману інформацію, вона надсилається безпосередньо до файлу для нас.  Оскільки немає виводу вікна терміналу для відображення, curl виводить набір інформації про прогрес.</p>
<p>У попередньому прикладі цього не було, оскільки інформація про прогрес була б розкидана по всьому вихідному коду веб-сторінки, тому curl автоматично придушив його.</p>
<p>У цьому прикладі curl виявляє, що вихідні дані перенаправляються до файлу, і що безпечно створювати інформацію про хід виконання.</p>
<p><img loading=

Наведена інформація:

% Всього: загальна сума, яку потрібно отримати.
% отриманих: відсоток і фактичні значення даних, отриманих на даний момент.
% 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

Завантаження починається і йде до завершення.

  Як встановити музичний плеєр Museeks на Linux

Якщо ми примусово перервемо завантаження за допомогою 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 (голова) ви можете отримати лише заголовки HTTP. Це те саме, що відправити Команда HTTP HEAD на веб-сервер.

curl -I www.twitter.com

Ця команда отримує лише інформацію; він не завантажує веб-сторінки чи файли.

Завантаження кількох URL-адрес

За допомогою xargs ми можемо завантажити кілька URL-адреси якось. Можливо, ми хочемо завантажити серію веб-сторінок, які становлять одну статтю або навчальний посібник.

Скопіюйте ці URL-адреси в редактор і збережіть їх у файлі під назвою «urls-to-download.txt». Ми можемо використовувати xargs для опрацювати зміст кожного рядка текстового файлу як параметр, який він, у свою чергу, подаватиме для згортання.

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-адреси для згортання по одному:

xargs -n 1 curl -O 

Note that this command uses the -O (remote file) output command, which uses an uppercase “O.” This option causes curl to save the retrieved  file with the same name that the file has on the remote server.

The -n 1 option tells xargs to treat each line of the text file as a single parameter.

When you run the command, you’ll see multiple downloads start and finish, one after the other.

Checking in the file browser shows the multiple files have been downloaded. Each one bears the name it had on the remote server.

Downloading Files From an FTP Server

Using curl with a File Transfer Protocol (FTP) server is easy, even if you have to authenticate with a username and password. To pass a username and password with curl use the -u (user) option, and type the username, a colon “:”, and the password. Don’t put a space before or after the colon.

This is a free-for-testing FTP server hosted by Rebex. The test FTP site has a pre-set username of “demo”, and the password is “password.” Don’t use this type of weak username and password on a production or “real” FTP server.

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

Ось ще один приклад, який використовує API Google. Він повертає об’єкт JSON, що описує книгу. Параметр, який ви повинні вказати, це Міжнародний стандартний номер книги (ISBN) номер книги. Ви можете знайти їх на задній обкладинці більшості книг, зазвичай під штрих-кодом. Параметр, який ми будемо використовувати тут: «0131103628».

curl https://www.googleapis.com/books/v1/volumes?q=isbn:0131103628

Повернені дані є вичерпними:

Іноді завиваються, іноді wget

Якби я хотів завантажити вміст із веб-сайту й запропонувати деревоподібну структуру веб-сайту здійснювати рекурсивний пошук цього вмісту, я б використав wget.

Якби я хотів взаємодіяти з віддаленим сервером або API і, можливо, завантажувати деякі файли чи веб-сторінки, я б використав curl. Особливо, якщо протокол був одним із багатьох, не підтримуваних wget.