Како користити цурл за преузимање датотека са Линук командне линије

Linux komanda `curl` može da uradi mnogo više od prostog preuzimanja fajlova. Saznajte za šta je sve sposoban `curl` i u kojim situacijama je bolje koristiti ga umesto `wget`.

`curl` vs. `wget`: Koja je razlika?

Često se ljudi pitaju koje su tačno prednosti i mane komandi `wget` i `curl`. Ove komande imaju preklapajuće funkcionalnosti. Obe mogu da preuzimaju datoteke sa udaljenih lokacija, ali tu se sličnosti uglavnom završavaju.

`wget` je izvanredan alat za preuzimanje sadržaja i datoteka. Može preuzimati fajlove, web stranice i cele direktorijume. Poseduje sofisticirane mehanizme za praćenje linkova na web stranicama i rekurzivno preuzimanje sadržaja sa celog web sajta. Neprikosnoven je kao menadžer preuzimanja u komandnoj liniji.

`curl` je namenjen za sasvim drugačije svrhe. Iako može da preuzima datoteke, nije sposoban da rekurzivno pretražuje web sajt u potrazi za sadržajem za preuzimanje. Osnovna funkcija `curl` komande je interakcija sa udaljenim sistemima slanjem zahteva i primanjem njihovih odgovora. Ti odgovori mogu biti sadržaj web stranice, fajlovi, ali i podaci dobijeni putem web servisa ili API-ja kao rezultat „pitanja“ postavljenog u `curl` zahtevu.

Takođe, `curl` nije ograničen samo na web sajtove. Podržava više od 20 protokola, uključujući HTTP, HTTPS, SCP, SFTP i FTP. Zbog superiornog načina obrade Linux cevi, `curl` se lakše integriše sa drugim komandama i skriptama.

Autor `curl`-a ima web stranicu na kojoj opisuje razlike koje on vidi između `curl` i `wget` komandi.

Instaliranje `curl`-a

Na računarima korišćenim za istraživanje ovog teksta, Fedora 31 i Manjaro 18.1.0 su već imali instaliran `curl`. `curl` je trebalo instalirati na Ubuntu 18.04 LTS. Na Ubuntu-u, pokrenite sledeću komandu da biste ga instalirali:

sudo apt-get install curl

Verzija `curl`-a

Opcija `–version` prikazuje verziju `curl`-a, kao i sve protokole koje podržava.

curl --version

Preuzimanje Web Stranice

Kada `curl` usmerimo ka nekoj web stranici, on će je preuzeti.

curl https://www.bbc.com

Međutim, po defaultu, on će ispisati izvorni kod stranice u terminal.

Važno je napomenuti: Ako ne specificirate `curl`-u da želite da se nešto sačuva kao datoteka, on će to uvek prikazati u terminalu. Ako je datoteka koju preuzimate binarna, ishod može biti nepredvidiv. Školjka može pokušati da interpretira neke bajtove iz binarne datoteke kao kontrolne karaktere ili izlazne sekvence.

Čuvanje podataka u datoteku

Neka `curl` preusmeri izlaz u datoteku:

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

Ovaj put ne vidimo preuzete podatke, oni se šalju direktno u datoteku. Pošto nema izlaza na terminalu, `curl` emituje informacije o napretku preuzimanja.

To nije radio u prethodnom primeru jer bi informacije o napretku bile isprepletane sa izvornim kodom stranice, pa ih je `curl` automatski potisnuo.

U ovom primeru, `curl` detektuje da se izlaz preusmerava u fajl i sigurno može da generiše informacije o napretku.

Informacije koje se prikazuju su:

% Total: Ukupna količina podataka za preuzimanje.
% Received: Procenat i količina preuzetih podataka do sada.
% Xferd: Procenat i količina poslatih podataka, ako se podaci uploaduju.
Average download speed: Prosečna brzina preuzimanja.
Average upload speed: Prosečna brzina slanja.
Total time: Ukupno procenjeno vreme trajanja transfera.
Time spent: Vreme koje je do sada proteklo tokom transfera.
Time left: Procenjeno vreme preostalo do završetka transfera.
Current speed: Trenutna brzina prenosa.

Pošto smo preusmerili izlaz iz `curl`-a u fajl, sada imamo fajl pod imenom „bbc.html“.

Dvostrukim klikom na taj fajl, otvoriće se vaš default pretraživač i prikazaće preuzetu web stranicu.

Napominjemo da je adresa u adresnoj traci pretraživača lokalna datoteka na ovom računaru, a ne udaljena web lokacija.

Ne moramo da preusmeravamo izlaz da bismo kreirali fajl. Možemo da koristimo opciju `-o` (output) i kažemo `curl`-u da kreira datoteku. Ovde koristimo opciju `-o` i dajemo ime datoteke koju želimo da kreiramo: „bbc.html“.

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

Korišćenje trake napretka za praćenje preuzimanja

Umesto tekstualnih informacija o preuzimanju, možete da koristite jednostavnu traku napretka sa opcijom `-#` (progress bar).

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

Restartovanje prekinutog preuzimanja

Lako je restartovati preuzimanje koje je prekinuto ili prekinuto. Započnimo sa preuzimanjem veće datoteke. Koristićemo najnoviju LTS verziju Ubuntu-a 18.04. Koristićemo opciju `–output` da navedemo ime datoteke u koju želimo da je sačuvamo: „ubuntu180403.iso“.

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

Preuzimanje počinje i napreduje ka kraju.

Ako nasilno prekinemo preuzimanje sa `Ctrl+C`, vratićemo se na komandnu liniju i preuzimanje će biti prekinuto.

Da biste ponovo pokrenuli preuzimanje, koristite opciju `-C` (continue at). Ovo nalaže `curl`-u da ponovo pokrene preuzimanje na određenoj tački u okviru ciljne datoteke. Ako koristite crticu `-` kao offset, `curl` će pogledati već preuzeti deo fajla i odrediti tačan offset koji će koristiti.

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

Preuzimanje je nastavljeno. `curl` izveštava o offset-u na kojem je nastavio preuzimanje.

Preuzimanje HTTP zaglavlja

Sa opcijom `-I` (head), možete da preuzmete samo HTTP zaglavlja. Ovo je isto kao da šaljete HTTP HEAD komandu na web server.

curl -I www.twitter.com

Ova komanda preuzima samo informacije; ne preuzima nikakve web stranice ili datoteke.

Preuzimanje više URL-ova

Korišćenjem `xargs` možemo preuzeti više URL adresa odjednom. Možda želimo da preuzmemo seriju web stranica koje čine jedan članak ili vodič.

Kopirajte ove URL adrese u editor i sačuvajte ih u fajl pod nazivom „urls-to-download.txt“. Možemo koristiti `xargs` da tretiramo sadržaj svakog reda tekstualnog fajla kao parametar koji će se, zauzvrat, proslediti `curl`-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

Ovo je komanda koju treba da koristimo da bi `xargs` prosledio ove URL adrese `curl`-u jednu po jednu:

xargs -n 1 curl -O < urls-to-download.txt

Ova komanda koristi opciju `-O` (remote file) koja koristi veliko slovo „O“. Ova opcija nalaže `curl`-u da sačuva preuzeti fajl sa istim imenom koje taj fajl ima na udaljenom serveru.

Opcija `-n 1` kaže `xargs`-u da tretira svaki red iz tekstualnog fajla kao jedan parametar.

Kada pokrenete ovu komandu, videćete više preuzimanja koja počinju i završavaju se jedno za drugim.

U file browser-u se vidi da su mnoge datoteke preuzete. Svaka od njih ima isto ime kao na udaljenom serveru.

Preuzimanje Fajlova sa FTP Servera

Korišćenje `curl`-a sa File Transfer Protocol (FTP) serverom je jednostavno, čak i ako morate da se autentifikujete sa korisničkim imenom i lozinkom. Da biste prosledili korisničko ime i lozinku pomoću `curl`-a, koristite opciju `-u` (user) i unesite korisničko ime, dvotačku „:“, a zatim lozinku. Ne stavljajte razmak pre ili posle dvotačke.

Ovo je besplatan FTP server za testiranje koji hostuje Rebex. Test FTP sajt ima unapred podešeno korisničko ime „demo“, a lozinka je „password“. Nemojte koristiti ovako slabo korisničko ime i lozinku na produkcionom ili „pravom“ FTP serveru.

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

`curl` detektuje da ga usmeravamo na FTP server i vraća listu datoteka koje se nalaze na serveru.

Jedina datoteka na ovom serveru je „readme.txt“, dužine 403 bajta. Hajde da je preuzmemo. Koristite istu komandu kao malo pre, sa dodatim imenom datoteke:

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

Datoteka se preuzima i `curl` prikazuje njen sadržaj u terminalu.

U skoro svim slučajevima, zgodnije je da se preuzeta datoteka sačuva na disk umesto da se prikaže u terminalu. Još jednom možemo koristiti opciju izlaz `-O` (remote file) da sačuvamo datoteku na disk, sa istim imenom kao na udaljenom serveru.

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

Datoteka se preuzima i čuva na disk. Možemo koristiti `ls` da proverimo detalje datoteke. Ima isto ime kao datoteka na FTP serveru i iste je dužine, 403 bajta.

ls -hl readme.txt

Slanje Parametara na Udaljene Servere

Neki udaljeni serveri prihvataju parametre u zahtevima koji im se šalju. Parametri se mogu koristiti za formatiranje vraćenih podataka, ili se mogu koristiti za odabir tačnih podataka koje korisnik želi da preuzme. Često je moguće komunicirati sa web interfejsima za programiranje aplikacija (API) koristeći `curl`.

Kao jednostavan primer, ipify web-sajt ima API koji se može upitati da bi se utvrdila vaša spoljna IP adresa.

curl https://api.ipify.org

Dodavanjem parametra `format` u komandu sa vrednošću „json“, možemo ponovo da zatražimo našu spoljnu IP adresu, ali ovaj put će vraćeni podaci biti kodirani u JSON formatu.

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

Evo još jednog primera koji koristi Google API. Vraća JSON objekat koji opisuje knjigu. Parametar koji morate da navedete je Međunarodni standardni broj knjige (ISBN). Možete ih pronaći na zadnjoj korici većine knjiga, obično ispod bar koda. Parametar koji ćemo ovde koristiti je „0131103628“.

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

Vraćeni podaci su veoma detaljni:

Ponekad `curl`, ponekad `wget`

Ako bih želeo da preuzmem sadržaj sa web sajta i rekurzivno pretražim strukturu stabla sajta za taj sadržaj, koristio bih `wget`.

Ako bih želeo da komuniciram sa udaljenim serverom ili API-jem i eventualno preuzmem neke fajlove ili web stranice, koristio bih `curl`. Pogotovo ako je protokol bio jedan od mnogih koje `wget` ne podržava.