Cum să utilizați curl pentru a descărca fișiere de pe linia de comandă Linux

Comanda Linux curl poate face mult mai mult decât descărcarea fișierelor. Aflați de ce este capabil curl și când ar trebui să îl utilizați în loc de wget.

curl vs. wget: Care este diferența?

Oamenii se luptă adesea să identifice punctele forte relative ale comenzilor wget și curl. Comenzile au o oarecare suprapunere funcțională. Fiecare poate prelua fișiere din locații îndepărtate, dar aici se termină asemănarea.

wget este o instrument fantastic pentru descărcarea de conținut și fișiere. Poate descărca fișiere, pagini web și directoare. Conține rutine inteligente pentru a parcurge link-uri în paginile web și pentru a descărca recursiv conținut pe un întreg site. Este de neegalat ca manager de descărcare în linie de comandă.

bucla satisface o nevoie cu totul diferită. Da, poate prelua fișiere, dar nu poate naviga recursiv pe un site web în căutarea conținutului de preluat. Ceea ce face curl de fapt este să vă lase să interacționați cu sistemele de la distanță făcând cereri către acele sisteme și regăsind și afișând răspunsurile acestora. Aceste răspunsuri ar putea fi conținut și fișiere ale paginii web, dar pot conține și date furnizate printr-un serviciu web sau API ca urmare a „întrebării” adresate de cererea curl.

Și curl nu se limitează la site-uri web. curl acceptă peste 20 de protocoale, inclusiv HTTP, HTTPS, SCP, SFTP și FTP. Și, fără îndoială, datorită manipulării sale superioare a conductelor Linux, curl poate fi integrat mai ușor cu alte comenzi și scripturi.

Autorul cărții curl are o pagină web care descrie diferențele pe care le vede între curl și wget.

Instalarea buclei

Dintre computerele folosite pentru cercetarea acestui articol, Fedora 31 și Manjaro 18.1.0 aveau curl deja instalat. curl trebuia instalat pe Ubuntu 18.04 LTS. Pe Ubuntu, rulați această comandă pentru a o instala:

sudo apt-get install curl

Versiunea curl

Opțiunea –version face ca curlreport versiunea sa. De asemenea, listează toate protocoalele pe care le acceptă.

curl --version

Preluarea unei pagini web

Dacă îndreptăm curl către o pagină web, aceasta o va prelua pentru noi.

curl https://www.bbc.com

Dar acțiunea sa implicită este să-l arunce în fereastra terminalului ca cod sursă.

  Cum se instalează ZFS pe Linux

Atenție: dacă nu îi spuneți lui curl că doriți ceva stocat ca fișier, îl va arunca întotdeauna în fereastra terminalului. Dacă fișierul pe care îl regăsește este un fișier binar, rezultatul poate fi imprevizibil. Shell-ul poate încerca să interpreteze unele dintre valorile octeților din fișierul binar ca caractere de control sau secvențe de evadare.

Salvarea datelor într-un fișier

Să îi spunem lui curl să redirecționeze rezultatul într-un fișier:

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

curl https://www.bbc.com > bbc.html într-o fereastră de terminal” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>De data aceasta nu vedem informațiile preluate, acestea sunt trimise direct în fișier pentru noi.  Deoarece nu există o ieșire a ferestrei terminalului de afișat, curl scoate un set de informații despre progres.</p>
<p>Nu a făcut acest lucru în exemplul anterior, deoarece informațiile despre progres ar fi fost împrăștiate în codul sursă al paginii web, deci curl l-a suprimat automat.</p>
<p>În acest exemplu, curl detectează că rezultatul este redirecționat către un fișier și că este sigur să generați informațiile despre progres.</p>
<p><img loading=

Informatiile furnizate sunt:

% Total: suma totală care trebuie recuperată.
% primit: procentul și valorile reale ale datelor preluate până acum.
% Xferd: procentul și efectivul trimis, dacă datele sunt încărcate.
Viteza medie de descărcare: viteza medie de descărcare.
Viteza medie de încărcare: viteza medie de încărcare.
Timp total: durata totală estimată a transferului.
Timp petrecut: timpul scurs până acum pentru acest transfer.
Timp rămas: timpul estimat rămas până la finalizarea transferului
Viteza curentă: viteza de transfer curentă pentru acest transfer.

Deoarece am redirecționat rezultatul de la curl la un fișier, acum avem un fișier numit „bbc.html”.

Făcând dublu clic pe acel fișier se va deschide browserul implicit, astfel încât să afișeze pagina web preluată.

Rețineți că adresa din bara de adrese a browserului este un fișier local de pe acest computer, nu un site web la distanță.

Nu trebuie să redirecționăm rezultatul pentru a crea un fișier. Putem crea un fișier utilizând opțiunea -o (ieșire) și spunându-i lui curl să creeze fișierul. Aici folosim opțiunea -o și furnizăm numele fișierului pe care dorim să-l creăm „bbc.html”.

curl -o bbc.html https://www.bbc.com

Utilizarea unei bare de progres pentru a monitoriza descărcările

Pentru a înlocui informațiile de descărcare bazate pe text cu o simplă bară de progres, utilizați opțiunea -# (bara de progres).

curl -x -o bbc.html https://www.bbc.com

Repornirea unei descărcări întrerupte

Este ușor să reporniți o descărcare care a fost încheiată sau întreruptă. Să începem descărcarea unui fișier considerabil. Vom folosi cea mai recentă versiune de asistență pe termen lung a Ubuntu 18.04. Folosim opțiunea –output pentru a specifica numele fișierului în care dorim să-l salvăm: „ubuntu180403.iso”.

curl --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

Descărcarea începe și își parcurge drumul spre finalizare.

  Cum se schimbă numele de gazdă a computerului Linux

Dacă întrerupem forțat descărcarea cu Ctrl+C , revenim la promptul de comandă și descărcarea este abandonată.

Pentru a reporni descărcarea, utilizați opțiunea -C (continuați la). Acest lucru face ca curl să repornească descărcarea într-un punct specificat sau decalaj în fișierul țintă. Dacă utilizați o cratimă – ca decalaj, curl va analiza porțiunea deja descărcată a fișierului și va determina offset-ul corect pe care să-l folosească.

curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

Descărcarea este repornită. curl raportează offset-ul la care repornește.

Se preiau antetele HTTP

Cu opțiunea -I (head), puteți prelua numai anteturile HTTP. Aceasta este la fel cu trimiterea Comanda HTTP HEAD către un server web.

curl -I www.twitter.com

Această comandă preia numai informații; nu descarcă pagini web sau fișiere.

Descărcarea mai multor adrese URL

Folosind xargs putem descărca mai multe URL-uri o dată. Poate că vrem să descarcăm o serie de pagini web care alcătuiesc un singur articol sau tutorial.

Copiați aceste adrese URL într-un editor și salvați-l într-un fișier numit „urls-to-download.txt”. Putem folosi xargs pentru tratați conținutul fiecărei rânduri a fișierului text ca parametru pe care îl va alimenta pentru a curba, la rândul său.

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

Aceasta este comanda pe care trebuie să o folosim pentru ca xargs să treacă aceste adrese URL pentru a le curla pe rând:

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 își dă seama că îl îndreptăm către un server FTP și returnează o listă a fișierelor care sunt prezente pe server.

Singurul fișier de pe acest server este un fișier „readme.txt”, cu o lungime de 403 octeți. Să-l recuperăm. Utilizați aceeași comandă ca acum un moment, cu numele fișierului atașat:

curl -u demo:password ftp://test.rebex.net/readme.txt

Fișierul este preluat și curl își afișează conținutul în fereastra terminalului.

În aproape toate cazurile, va fi mai convenabil ca fișierul preluat să fie salvat pe disc pentru noi, decât să fie afișat în fereastra terminalului. Încă o dată putem folosi comanda de ieșire -O (fișier la distanță) pentru a avea fișierul salvat pe disc, cu același nume de fișier pe care îl are pe serverul de la distanță.

curl -O -u demo:password ftp://test.rebex.net/readme.txt

Fișierul este preluat și salvat pe disc. Putem folosi ls pentru a verifica detaliile fișierului. Are același nume ca fișierul de pe serverul FTP și are aceeași lungime, 403 octeți.

ls -hl readme.txt

Trimiterea parametrilor către servere la distanță

Unele servere la distanță vor accepta parametri în cererile care le sunt trimise. Parametrii pot fi utilizați pentru a formata datele returnate, de exemplu, sau pot fi utilizați pentru a selecta datele exacte pe care utilizatorul dorește să le recupereze. Este adesea posibil să interacționați cu web interfețe de programare a aplicațiilor (API) folosind curl.

Ca exemplu simplu, the ipify site-ul web are un API care poate fi interogat pentru a vă afla adresa IP externă.

curl https://api.ipify.org

Adăugând parametrul format la comandă, cu valoarea „json” putem solicita din nou adresa noastră IP externă, dar de data aceasta datele returnate vor fi codificate în format JSON.

curl https://api.ipify.org?format=json

Iată un alt exemplu care utilizează un API Google. Returnează un obiect JSON care descrie o carte. Parametrul pe care trebuie să-l furnizați este Numărul standard internațional al cărții (ISBN) numărul unei cărți. Le puteți găsi pe coperta din spate a majorității cărților, de obicei sub un cod de bare. Parametrul pe care îl vom folosi aici este „0131103628”.

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

Datele returnate sunt complete:

Uneori curl, alteori wget

Dacă aș dori să descarc conținut de pe un site web și să am structura arborescentă a site-ului web căutată recursiv pentru acel conținut, aș folosi wget.

Dacă aș vrea să interacționez cu un server la distanță sau cu un API și, eventual, să descarc unele fișiere sau pagini web, aș folosi curl. Mai ales dacă protocolul a fost unul dintre multele neacceptate de wget.