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