Jak używać curl do pobierania plików z wiersza poleceń systemu Linux

Polecenie curl w systemie Linux ma znacznie szersze zastosowanie niż tylko pobieranie plików. Oto, na co możesz liczyć, korzystając z curl oraz kiedy warto wybrać go zamiast wget.

Różnice między curl a wget

Użytkownicy często mają problem z określeniem, jakie są kluczowe różnice między curl a wget. Oba te narzędzia oferują pewne wspólne funkcje, takie jak pobieranie plików z zewnętrznych lokalizacji, ale ich zastosowania są różne.

wget to doskonałe narzędzie do pobierania plików i treści. Umożliwia nie tylko pobieranie pojedynczych plików, ale także całych stron internetowych oraz katalogów. Jego inteligentne algorytmy pozwalają na przechodzenie przez odnośniki na stronach oraz wykonywanie rekurencyjnego pobierania treści z całych witryn. Jest to niezastąpiony menedżer pobierania z poziomu terminala.

Natomiast curl ma zupełnie inne zastosowania. Choć również potrafi pobierać pliki, nie jest w stanie rekurencyjnie przeszukiwać witryn w poszukiwaniu treści do pobrania. Curl ma za zadanie interakcję z zdalnymi systemami przez wysyłanie do nich żądań i odbieranie odpowiedzi. W odpowiedziach tych mogą znajdować się zarówno pliki, jak i dane pochodzące z interfejsów API oraz usług sieciowych w odpowiedzi na zapytania kierowane przez curl.

curl nie ogranicza się jedynie do obsługi witryn internetowych. Wspiera ponad 20 różnych protokołów, w tym HTTP, HTTPS, SCP, SFTP i FTP. Jego lepsza integracja z potokami w systemie Linux sprawia, że łatwiej go używać w połączeniu z innymi poleceniami i skryptami.

Twórca curl prowadzi stronę, na której opisuje różnice między curl a wget.

Instalacja curl

Na komputerach używanych do napisania tego artykułu, takich jak Fedora 31 oraz Manjaro 18.1.0, curl był już zainstalowany. Natomiast w Ubuntu 18.04 LTS konieczna była jego instalacja. Aby to zrobić, wystarczy uruchomić poniższe polecenie:

sudo apt-get install curl

Sprawdzanie wersji curl

Aby sprawdzić wersję curl, użyj opcji –version. Otrzymasz również listę wszystkich dostępnych protokołów.

curl --version

Pobieranie treści strony internetowej

Aby użyć curl do pobrania treści konkretnej strony, wystarczy wskazać jej adres URL:

curl https://www.bbc.com

Domyślnie curl wyświetli kod źródłowy strony w terminalu.

Ważne: jeśli nie przekażesz curl informacji o zapisaniu pliku, wyjście zawsze trafi do terminala. W przypadku plików binarnych wynik może być nieprzewidywalny, ponieważ powłoka może próbować interpretować bajty jako znaki kontrolne lub sekwencje specjalne.

Zapis danych do pliku

Możesz przekazać curl informacje o zapisaniu danych do pliku:

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

W tej sytuacji pobrane informacje są kierowane bezpośrednio do pliku. Zamiast wyświetlania danych w terminalu, curl pokaże postęp pobierania.

W poprzednim przykładzie informacje o postępie byłyby wymieszane z kodem źródłowym, dlatego curl je pominął. Tutaj curl zauważa, że ​​wyjście jest przesyłane do pliku, więc postęp może być bezpiecznie wyświetlany.

Podane informacje to:

  • % Razem: Całkowita ilość do pobrania.
  • % Odebranych: Procent oraz rzeczywista liczba pobranych danych.
  • % Xferd: Procent oraz rzeczywista liczba przesyłanych danych, jeśli występuje przesyłanie.
  • Średnia prędkość pobierania: Średnia prędkość pobierania.
  • Średnia prędkość wysyłania: Średnia prędkość wysyłania.
  • Całkowity czas: szacowany całkowity czas transferu.
  • Spędzony czas: czas, jaki minął do tej pory dla tego transferu.
  • Pozostały czas: szacowany czas pozostały do zakończenia transferu.
  • Aktualna prędkość: bieżąca prędkość transferu dla tego transferu.

Po zapisaniu danych mamy plik o nazwie „bbc.html”.

Możesz dwukrotnie kliknąć ten plik, aby otworzyć go w domyślnej przeglądarce i zobaczyć pobraną stronę.

Warto zauważyć, że adres w pasku przeglądarki odnosi się do lokalnego pliku, a nie do zdalnej witryny.

Nie musisz przekierowywać wyjścia, aby utworzyć plik. Możesz to zrobić za pomocą opcji -o (wyjście), wskazując curlowi nazwę pliku, który chcesz stworzyć:

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

Używanie paska postępu do śledzenia pobierania

Aby zamiast tekstowych informacji o pobieraniu zobaczyć prosty pasek postępu, użyj opcji –# (pasek postępu).

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

Wznawianie przerwanego pobierania

Wznawianie przerwanego pobierania jest prostą czynnością. Zaczniemy od pobierania dużego pliku, na przykład najnowszej wersji systemu Ubuntu 18.04 LTS. Użyjemy opcji –output, aby określić nazwę pliku, w którym chcemy go zapisać: „ubuntu180403.iso”.

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

Proces pobierania się rozpoczyna i zbliża do końca.

Gdy przerwiesz pobieranie, używając Ctrl + C, wrócisz do wiersza poleceń, a proces pobierania zostanie zatrzymany.

Aby wznowić pobieranie, użyj opcji -C (kontynuuj). Spowoduje to, że curl wznowi pobieranie od miejsca, w którym zostało przerwane. Jeśli użyjesz łącznika – jako przesunięcia, curl sprawdzi, ile zostało już pobrane i określi odpowiednie przesunięcie do wznowienia.

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

Pobieranie zostanie wznowione, a curl wyświetli przesunięcie, od którego zaczyna kontynuować.

Pobieranie nagłówków HTTP

Za pomocą opcji -I (head) możesz pobrać jedynie nagłówki HTTP. Działa to na zasadzie wysyłania polecenia HTTP HEAD do serwera.

curl -I www.twitter.com

To polecenie zwraca jedynie informacje, nie pobiera żadnych treści ani plików.

Pobieranie wielu adresów URL

Dzięki xargs można jednocześnie pobierać wiele plików adresów URL. Może to być przydatne, gdy chcesz pobrać kilka stron, które składają się na dany artykuł lub poradnik.

Skopiuj adresy URL do edytora i zapisz je w pliku o nazwie „urls-to-download.txt”. Możesz użyć xargs, aby traktować zawartość każdego wiersza tego pliku jako parametry dla 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

Aby zrealizować pobieranie, użyj następującego polecenia:

xargs -n 1 curl -O 

Warto zauważyć, że polecenie to wykorzystuje opcję -O (plik zdalny), która zapisuje pobrany plik z taką samą nazwą, jaką ma na serwerze. Opcja -n 1 sprawia, że xargs traktuje każdy wiersz pliku jako oddzielny parametr.

Po uruchomieniu polecenia zauważysz, że pobieranie wielu plików odbywa się jeden po drugim.

Sprawdzając w menedżerze plików, zauważysz, że wiele plików zostało pobranych. Każdy z nich ma tę samą nazwę, co na serwerze zdalnym.

Pobieranie plików z serwera FTP

Korzystanie z curl do pobierania plików z serwera FTP jest proste, nawet jeśli wymaga to uwierzytelnienia przy użyciu nazwy użytkownika i hasła. Aby to zrobić, użyj opcji -u (użytkownik), wpisując nazwę użytkownika, dwukropek „:” oraz hasło. Nie dodawaj spacji przed ani po dwukropku.

Oto przykład testowego serwera FTP obsługiwanego przez Rebex. Posiada on domyślną nazwę użytkownika „demo” oraz hasło „password”. Pamiętaj, aby nie używać słabych haseł na produkcyjnych serwerach FTP.

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

curl informuje, że łączymy się z serwerem FTP i wyświetla listę plików znajdujących się na serwerze.

Na serwerze znajduje się plik „readme.txt” o wielkości 403 bajtów. Aby go pobrać, użyj tego samego polecenia, dodając nazwę pliku:

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

Po wykonaniu polecenia plik zostanie pobrany, a jego zawartość zostanie wyświetlona w terminalu.

W większości przypadków lepiej jest zapisać pobrany plik na dysku niż wyświetlać go w terminalu. Możesz użyć polecenia wyjścia -O (plik zdalny), aby zapisać plik na dysku z identyczną nazwą, jak na serwerze zdalnym.

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

Plik zostanie zapisany na dysku. Możesz użyć polecenia ls, aby sprawdzić szczegóły pliku. Będzie on miał tę samą nazwę jak plik na serwerze FTP oraz identyczną długość 403 bajty.

ls -hl readme.txt

Wysyłanie parametrów do serwerów zdalnych

Niektóre zdalne serwery akceptują parametry w żądaniach do nich wysyłanych. Parametry te mogą służyć na przykład do formatowania zwracanych danych lub precyzowania, jakie dane użytkownik chce pobrać. Często można w ten sposób interagować z interfejsami API przy użyciu curl.

Na przykład, strona ipify posiada API, które pozwala na zapytanie o zewnętrzny adres IP.

curl https://api.ipify.org

Dodając do polecenia parametr format, ustawiony na „json”, możemy ponownie zapytać o nasz zewnętrzny adres IP, a dane zostaną zwrócone w formacie JSON.

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

Inny przykład to interakcja z API Google, które zwraca obiekt JSON opisujący książkę. Wymaganym parametrem jest międzynarodowy numer standardowy książki (ISBN). Można go znaleźć na tylnej okładce wielu książek, często pod kodem kreskowym. Użyjemy numeru ISBN „0131103628”.

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

Dane zwrócone przez API są bardzo szczegółowe:

Kiedy używać curl, a kiedy wget

Jeśli chciałbym pobrać treść strony internetowej i przeszukać strukturę witryny rekurencyjnie, skorzystałbym z wget.

Natomiast gdy potrzebuję interakcji z zdalnym serwerem lub API, co często wiąże się z pobieraniem plików lub stron, sięgnąłbym po curl. Jest to szczególnie ważne, gdy używany protokół nie jest obsługiwany przez wget.


newsblog.pl