Jak používat curl ke stahování souborů z příkazového řádku Linuxu

Příkaz `curl` v prostředí Linuxu nabízí mnohem širší spektrum možností, než je pouhé stahování souborů. Objevte skrytý potenciál tohoto nástroje a naučte se, kdy je vhodnější jej použít namísto příkazu `wget`.

Rozdíly mezi `curl` a `wget`

Uživatelé často srovnávají schopnosti příkazů `wget` a `curl`, přičemž oba disponují částečným překryvem funkcí. Oba příkazy dokážou stahovat data ze vzdálených umístění, avšak zde veškerá podobnost končí.

`wget` je vynikající nástroj pro stahování obsahu a souborů. Umí stahovat nejen jednotlivé soubory, ale i celé webové stránky nebo adresáře. Je vybavený pokročilými mechanismy pro procházení odkazů na webových stránkách a rekurzivní stahování obsahu webu. V oblasti správy stahování z příkazové řádky je skutečně nepostradatelný.

Na druhou stranu, `curl` uspokojuje zcela odlišné potřeby. Sice také zvládne stahování souborů, ale neumožňuje rekurzivní procházení webu za účelem hledání a stahování obsahu. Hlavní síla `curl` spočívá v interakci se vzdálenými systémy. Umožňuje zasílat požadavky a následně přijímat a zobrazovat jejich odpovědi. Tyto odpovědi mohou obsahovat webové stránky a soubory, ale i data poskytovaná webovými službami nebo API v reakci na zaslaný požadavek.

A schopnosti `curl` se neomezují jen na webové stránky. Podporuje více než 20 protokolů, včetně HTTP, HTTPS, SCP, SFTP a FTP. Díky flexibilnímu zpracování linuxových kanálů je `curl` také snadno integrovatelný s dalšími příkazy a skripty.

Autor nástroje `curl` má vlastní webovou stránku, kde detailně popisuje rozdíly mezi `curl` a `wget`.

Instalace `curl`

V systémech Fedora 31 a Manjaro 18.1.0, které byly použity pro testování, byl příkaz `curl` již předinstalován. V Ubuntu 18.04 LTS bylo nutné jej doinstalovat pomocí tohoto příkazu:

sudo apt-get install curl

Zjištění verze `curl`

Pomocí volby `–version` získáte informace o aktuální verzi `curl` včetně seznamu podporovaných protokolů:

curl --version

Načtení webové stránky

Pokud zadáte `curl` webovou adresu, dojde k načtení obsahu stránky:

curl https://www.bbc.com

Ve výchozím nastavení však `curl` vypíše zdrojový kód stránky do terminálu.

Upozornění: Pokud explicitně neurčíte, že chcete uložit načtená data do souboru, `curl` je vždy vypíše do terminálu. V případě binárních souborů může být výsledek nepředvídatelný, protože shell se může pokusit interpretovat některé bajty jako řídicí znaky nebo escape sekvence.

Ukládání dat do souboru

Pro přesměrování výstupu `curl` do souboru použijte následující syntaxi:

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

Zobrazené informace zahrnují:

% Total: Celková velikost dat ke stažení.
% Received: Procento a aktuální objem stažených dat.
% Xferd: Procento a aktuálně odeslaná data (při nahrávání).
Avg Dload Speed: Průměrná rychlost stahování.
Avg Upload Speed: Průměrná rychlost nahrávání.
Time Total: Odhadovaná celková doba trvání přenosu.
Time Spent: Doba trvání přenosu do daného okamžiku.
Time Left: Odhadovaný čas zbývající do dokončení přenosu.
Current Speed: Aktuální přenosová rychlost.

Výsledkem je soubor `bbc.html`, který obsahuje stažená data.

Otevřením tohoto souboru ve webovém prohlížeči uvidíte staženou webovou stránku.

Je důležité si všimnout, že adresa v adresním řádku prohlížeče ukazuje na místní soubor, nikoli na vzdálenou webovou adresu.

Alternativně, můžeme použít volbu `-o` (output) a říct `curl`, ať vytvoří soubor s námi zadaným názvem. V tomto příkladu `curl` vytvoří soubor `bbc.html`:

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

Zobrazení ukazatele průběhu stahování

Pokud preferujete vizuální ukazatel průběhu stahování, použijte volbu `-#` (progress bar):

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

Obnovení přerušeného stahování

`curl` umožňuje snadno obnovit přerušené nebo nedokončené stahování. Pro demonstraci si začneme stahovat velký soubor – obraz ISO nejnovější verze Ubuntu 18.04. Pomocí volby `–output` specifikujeme název souboru `ubuntu180403.iso`.

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

Stahování se spustí a bude probíhat až do dokončení.

Pokud stahování násilně ukončíme kombinací kláves Ctrl+C, vrátíme se do příkazového řádku a stahování se zastaví.

Pro obnovení stahování použijte volbu `-C` (continue). Díky ní `curl` restartuje stahování od bodu nebo posunu v cílovém souboru, kde skončilo. Pokud jako posun použijete pomlčku `-`, `curl` se podívá na již staženou část souboru a automaticky určí správný posun:

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

Stahování se restartuje, přičemž `curl` vypíše posun, od kterého pokračuje.

Načítání HTTP hlaviček

Pomocí volby `-I` (head) načtete pouze HTTP hlavičky. Je to ekvivalentní odeslání HTTP příkazu HEAD na webový server:

curl -I www.twitter.com

Tento příkaz načte pouze informace, nestahuje žádný obsah webové stránky nebo soubory.

Stahování více URL

S pomocí příkazu `xargs` můžeme stáhnout více URL adres najednou. To se může hodit například při stahování sérií webových stránek tvořících jeden článek nebo návod.

Uložte si následující URL adresy do souboru s názvem `urls-to-download.txt`. Pomocí `xargs` můžeme zpracovat každý řádek tohoto textového souboru jako parametr, který se postupně předá příkazu `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

Pro předání URL adres z tohoto souboru do `curl` postupně jednu po druhé použijte tento příkaz:

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

Tento příkaz využívá volbu `-O` (remote file), která způsobí, že `curl` uloží stažené soubory s týmiž názvy, které mají na vzdáleném serveru.

Volba `-n 1` instruuje `xargs`, aby každý řádek textového souboru zpracoval jako samostatný parametr.

Po spuštění příkazu uvidíte stahování probíhat jedno za druhým.

Kontrola v souborovém prohlížeči ukazuje stažené soubory. Každý z nich nese název, který měl na vzdáleném serveru.

Stahování souborů z FTP serveru

Používání `curl` s FTP serverem je snadné, i pokud je nutné ověření uživatelským jménem a heslem. K odeslání uživatelského jména a hesla použijte volbu `-u` (user) a zadejte uživatelské jméno, dvojtečku „:“ a heslo. Mezi dvojtečkou a uživatelským jménem nebo heslem nesmí být mezera.

Pro testování použijeme bezplatný FTP server, který je hostovaný společností Rebex. Testovací FTP server má nastavené uživatelské jméno „demo“ a heslo „password“. V reálném prostředí se však důrazně nedoporučuje používat takto slabé přihlašovací údaje.

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

`curl` detekuje, že cílíme na FTP server a vrátí seznam souborů, které se na serveru nacházejí.

Na serveru se nachází jediný soubor `readme.txt` o velikosti 403 bajtů. Zkusme si jej stáhnout. Použijeme stejný příkaz jako před chvílí, ale připojíme k němu název souboru:

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

Soubor je stažen a `curl` vypíše jeho obsah v terminálu.

V naprosté většině případů bude pohodlnější uložit stažený soubor na disk, než jej zobrazovat v terminálu. I tentokrát můžeme použít volbu `-O` (remote file), která uloží soubor na disk se stejným názvem, jaký má na vzdáleném serveru.

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

Soubor se stáhne a uloží na disk. Příkazem `ls` ověříme detaily souboru. Soubor má stejný název jako soubor na FTP serveru a jeho velikost je 403 bajtů.

ls -hl readme.txt

Odesílání parametrů na vzdálené servery

Některé vzdálené servery přijímají parametry v požadavcích, které jsou na ně odesílány. Parametry se využívají například k formátování vrácených dat nebo k výběru specifických dat, která si uživatel přeje získat. Často je tak možné komunikovat s webovým rozhraním pro programování aplikací (API) s pomocí příkazu `curl`.

Jako jednoduchý příklad poslouží web ipify, který pomocí API poskytuje informace o vaší externí IP adrese:

curl https://api.ipify.org

Přidáním parametru `format` s hodnotou `json` opět požádáme o naši externí IP adresu, ale tentokrát budou data vrácena ve formátu JSON.

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

Dalším příkladem je použití Google API. Vrátí JSON objekt popisující knihu. Parametr, který musíte zadat, je Mezinárodní standardní číslo knihy (ISBN). Najdete jej na zadní straně obálky většiny knih, obvykle pod čárovým kódem. V tomto příkladu použijeme ISBN „0131103628“.

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

Vrátí komplexní sadu dat:

Kdy použít `curl` a kdy `wget`

Pokud potřebujete stáhnout obsah webové stránky včetně všech odkazovaných stránek, použijte příkaz `wget`.

Pokud potřebujete komunikovat se vzdáleným serverem nebo API a případně stáhnout soubory, použijte `curl`. To platí zejména v případech, kdy je použit protokol, který `wget` nepodporuje.