Wśród rozlicznych narzędzi wykorzystywanych przez administratorów systemów, wget zajmuje szczególnie ważne miejsce. Jego wszechstronność sprawia, że jest nieoceniony w diagnozowaniu problemów sieciowych.
Czym jest polecenie wget?
wget to popularne narzędzie konsolowe, powszechnie stosowane w systemach Unix/Linux do pobierania danych z internetu. Jest to bezpłatne rozwiązanie, które umożliwia nieinteraktywne pobieranie plików. wget domyślnie obsługuje protokoły HTTPS, HTTP oraz FTP, a także pozwala na korzystanie z serwerów proxy HTTP.
W jaki sposób wget wspiera rozwiązywanie problemów?
Zastosowań jest wiele.
Administratorzy systemów często pracują w terminalu. Podczas analizowania problemów z aplikacjami internetowymi, mogą potrzebować zweryfikować jedynie łączność, bez konieczności przeglądania całej strony. Podobnie, wget pozwala na sprawdzanie dostępności stron intranetowych czy pobieranie konkretnych zasobów w celu weryfikacji ich zawartości.
wget działa w sposób nieinteraktywny, co oznacza, że może działać w tle, nawet gdy użytkownik wyloguje się z systemu. W wielu sytuacjach, konieczne jest odłączenie od systemu w trakcie pobierania plików. wget w takiej sytuacji dokończy rozpoczęte zadanie w tle.
Narzędzie to umożliwia również pobieranie całych witryn internetowych na lokalny dysk. Potrafi śledzić odnośniki na stronach XHTML i HTML, tworząc ich lokalną kopię. W tym celu, musi rekursywnie pobierać kolejne strony, co jest niezwykle przydatne do zachowania ważnych treści do przeglądania w trybie offline.
Przejdźmy do praktycznych przykładów. Składnia polecenia wget prezentuje się następująco:
wget [opcja] [adres URL]
Pobieranie strony internetowej
Spróbujmy pobrać zawartość strony github.com:
wget github.com
Jeśli połączenie z siecią jest poprawne, polecenie pobierze stronę główną i wyświetli informacje podobne do poniższych:
[email protected]:~# wget github.com URL transformed to HTTPS due to an HSTS policy --2020-02-23 10:45:52-- https://github.com/ Resolving github.com (github.com)... 140.82.118.3 Connecting to github.com (github.com)|140.82.118.3|:443... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: ‘index.html’ index.html [ <=> ] 131.96K --.-KB/s in 0.04s 2020-02-23 10:45:52 (2.89 MB/s) - ‘index.html’ saved [135126] [email protected]:~#
Pobieranie wielu plików
Ta funkcja jest szczególnie przydatna, gdy konieczne jest pobranie wielu plików jednocześnie. Może to posłużyć jako podstawa do automatyzacji procesów pobierania za pomocą skryptów.
Przykładowo, pobierzmy pliki instalacyjne Pythona w wersjach 3.8.1 oraz 3.5.1:
wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Składnia jest następująca:
wget adres_URL_1 adres_URL_2 adres_URL_3
Wystarczy oddzielić poszczególne adresy URL spacjami.
Ograniczanie prędkości pobierania
Możliwość ograniczenia prędkości pobierania jest przydatna, gdy chcemy sprawdzić, jak długo zajmie pobranie danego pliku przy różnej przepustowości łącza.
Opcja `–limit-rate` pozwala na ustawienie limitu prędkości.
Poniżej przedstawiono wynik pobierania pliku Nodejs:
[email protected]:~# wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz --2020-02-23 10:59:58-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz Resolving nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ... Connecting to nodejs.org (nodejs.org)|104.20.23.46|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 14591852 (14M) [application/x-xz] Saving to: ‘node-v12.16.1-linux-x64.tar.xz’ node-v12.16.1-linux-x64.tar.xz 100%[===========================================================================================>] 13.92M --.-KB/s in 0.05s 2020-02-23 10:59:58 (272 MB/s) - ‘node-v12.16.1-linux-x64.tar.xz’ saved [14591852/14591852]
Plik o rozmiarze 13.92 MB został pobrany w ciągu 0.05 sekundy. Spróbujmy teraz ograniczyć prędkość pobierania do 500 KB/s:
[email protected]:~# wget --limit-rate=500k https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz --2020-02-23 11:00:18-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz Resolving nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ... Connecting to nodejs.org (nodejs.org)|104.20.23.46|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 14591852 (14M) [application/x-xz] Saving to: ‘node-v12.16.1-linux-x64.tar.xz.1’ node-v12.16.1-linux-x64.tar.xz.1 100%[===========================================================================================>] 13.92M 501KB/s in 28s 2020-02-23 11:00:46 (500 KB/s) - ‘node-v12.16.1-linux-x64.tar.xz.1’ saved [14591852/14591852]
Pobieranie z ograniczoną przepustowością trwało znacznie dłużej – 28 sekund. W sytuacji, gdy użytkownicy zgłaszają wolne pobieranie, a administrator podejrzewa problem z przepustowością ich łącza, opcja `–limit-rate` może posłużyć do zasymulowania problemu i weryfikacji jego przyczyn.
Pobieranie w tle
Pobieranie dużych plików lub plików z ograniczoną przepustowością może zająć dużo czasu. Jeśli nie chcemy obserwować postępu pobierania w terminalu, możemy skorzystać z opcji `-b`, aby uruchomić wget w tle:
[email protected]:~# wget -b https://slack.com Continuing in background, pid 25430. Output will be written to ‘wget-log.1’. [email protected]:~#
Ignorowanie błędów certyfikatów
Ta opcja jest przydatna podczas testowania aplikacji intranetowych, które nie posiadają prawidłowego certyfikatu. Domyślnie, wget zgłosi błąd, gdy certyfikat jest nieważny:
[email protected]:~# wget https://expired.badssl.com/ --2020-02-23 11:24:59-- https://expired.badssl.com/ Resolving expired.badssl.com (expired.badssl.com)... 104.154.89.105 Connecting to expired.badssl.com (expired.badssl.com)|104.154.89.105|:443... connected. ERROR: cannot verify expired.badssl.com's certificate, issued by ‘CN=COMODO RSA Domain Validation Secure Server CA,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB’: Issued certificate has expired. To connect to expired.badssl.com insecurely, use `--no-check-certificate'.
Powyższy przykład prezentuje pobieranie z adresu URL, którego certyfikat stracił ważność. W komunikacie jest sugestia, aby użyć opcji `–no-check-certificate`, która zignoruje weryfikację certyfikatu:
[email protected]:~# wget https://untrusted-root.badssl.com/ --no-check-certificate --2020-02-23 11:33:45-- https://untrusted-root.badssl.com/ Resolving untrusted-root.badssl.com (untrusted-root.badssl.com)... 104.154.89.105 Connecting to untrusted-root.badssl.com (untrusted-root.badssl.com)|104.154.89.105|:443... connected. WARNING: cannot verify untrusted-root.badssl.com's certificate, issued by ‘CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US’: Self-signed certificate encountered. HTTP request sent, awaiting response... 200 OK Length: 600 [text/html] Saving to: ‘index.html.6’ index.html.6 100%[===========================================================================================>] 600 --.-KB/s in 0s 2020-02-23 11:33:45 (122 MB/s) - ‘index.html.6’ saved [600/600] [email protected]:~#
Praktyczne, prawda?
Zobaczmy, jak sprawdzić nagłówek odpowiedzi HTTP:
Użycie opcji `-S` spowoduje wydrukowanie nagłówka, na przykład dla strony Coursera:
[email protected]:~# wget https://www.coursera.org -S --2020-02-23 11:47:01-- https://www.coursera.org/ Resolving www.coursera.org (www.coursera.org)... 13.224.241.48, 13.224.241.124, 13.224.241.82, ... Connecting to www.coursera.org (www.coursera.org)|13.224.241.48|:443... connected. HTTP request sent, awaiting response... HTTP/1.1 200 OK Content-Type: text/html Content-Length: 511551 Connection: keep-alive Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0 Date: Sun, 23 Feb 2020 11:47:01 GMT etag: W/"7156d-WcZHnHFl4b4aDOL4ZSrXP0iBX3o" Server: envoy Set-Cookie: CSRF3-Token=1583322421.s1b4QL6OXSUGHnRI; Max-Age=864000; Expires=Wed, 04 Mar 2020 11:47:02 GMT; Path=/; Domain=.coursera.org Set-Cookie: __204u=9205355775-1582458421174; Max-Age=31536000; Expires=Mon, 22 Feb 2021 11:47:02 GMT; Path=/; Domain=.coursera.org Strict-Transport-Security: max-age=31536000; includeSubDomains; preload X-Content-Type-Options: nosniff x-coursera-render-mode: html x-coursera-render-version: v2 X-Coursera-Request-Id: NCnPPlYyEeqfcxIHPk5Gqw X-Coursera-Trace-Id-Hex: a5ef7028d77ae8f8 x-envoy-upstream-service-time: 1090 X-Frame-Options: SAMEORIGIN x-powered-by: Express X-XSS-Protection: 1; mode=block X-Cache: Miss from cloudfront Via: 1.1 884d101a3faeefd4fb32a5d2a8a076b7.cloudfront.net (CloudFront) X-Amz-Cf-Pop: LHR62-C3 X-Amz-Cf-Id: vqvX6ZUQgtZAde62t7qjafIAqHXQ8BLAv8UhkPHwyTMpvH617yeIbQ== Length: 511551 (500K) [text/html]
Modyfikowanie nagłówka User-Agent
W pewnych sytuacjach może zajść potrzeba połączenia z witryną z wykorzystaniem niestandardowego klienta użytkownika lub klienta użytkownika konkretnej przeglądarki. Można to zrobić, dodając parametr `–user-agent`. Poniższy przykład prezentuje użycie klienta użytkownika o nazwie MyCustomUserAgent:
[email protected]:~# wget https://gf.dev --user-agent="MyCustomUserAgent"
Gdy aplikacja jest w fazie developmentu, może nie posiadać jeszcze odpowiedniego adresu URL do testów. Może też zajść potrzeba przetestowania pojedynczej instancji HTTP z wykorzystaniem adresu IP, ale z koniecznością dostarczenia nagłówka Host, aby aplikacja działała prawidłowo. W takiej sytuacji przyda się opcja `–header`.
Przykładowo, przetestujmy http://10.10.10.1 z nagłówkiem Host ustawionym na application.com:
wget --header="Host: application.com" http://10.10.10.1
Można wstawić dowolny nagłówek, nie tylko host.
Połączenie przez serwer proxy
W środowiskach DMZ, dostęp do internetu może być ograniczony. W takim przypadku, można skorzystać z serwera proxy:
wget -e use_proxy=yes http_proxy=$PROXYHOST:PORT http://externalsite.com
Należy pamiętać o zastąpieniu zmiennej `$PROXYHOST:PORT` rzeczywistymi danymi.
Połączenie z wykorzystaniem określonego protokołu TLS
Do testowania protokołu TLS zazwyczaj zaleca się stosowanie OpenSSL. Niemniej jednak, wget także może posłużyć do tego celu.
Użycie polecenia:
wget –secure-protocol=TLSv1_2 https://example.com
wymusi na wget nawiązanie połączenia przy użyciu protokołu TLS w wersji 1.2.
Podsumowanie
Znajomość podstawowych poleceń może znacznie ułatwić pracę administratora. Mam nadzieję, że przedstawione przykłady unaoczniły możliwości narzędzia wget.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.