Mester wget: Feilsøk nettverksproblemer som proff!

Et verktøy som ofte benyttes av systemadministratorer, er wget. Det viser seg svært nyttig ved feilsøking av web-relaterte problemer.

Hva er wget-kommandoen?

Wget er et populært kommandolinjeverktøy for Unix/Linux-systemer, primært brukt for å hente innhold fra internett. Det er kostnadsfritt og gir en ikke-interaktiv måte å laste ned filer på nett. Wget støtter standardprotokollene HTTPS, HTTP og FTP, og kan også benyttes med HTTP-proxyer.

Hvordan bidrar wget til feilsøking?

Wget tilbyr flere bruksområder for feilsøking.

Som systemadministrator arbeider man ofte i terminalen. Ved feilsøking av webapplikasjoner kan det være nødvendig å sjekke tilkoblingen uten å se på hele siden. Det kan også være nyttig å verifisere intranettnettsteder, eller laste ned en side for å bekrefte innholdet.

Wget er ikke-interaktivt, noe som gjør det mulig å kjøre kommandoen i bakgrunnen, selv etter at man har logget av. Dette er en viktig egenskap når man laster ned filer fra nettverket og samtidig trenger å koble fra systemet. Wget vil fortsette å kjøre og fullføre den tildelte oppgaven i bakgrunnen.

Verktøyet kan også hente hele nettsider til lokale maskiner. Det kan følge lenker i XHTML- og HTML-sider og lage en lokal kopi ved å laste ned sidene rekursivt. Dette er praktisk for nedlasting av viktige sider eller hele nettsteder for offline visning.

La oss se hvordan dette fungerer i praksis. Syntaksen for wget er som følger:

wget [alternativ] [URL]

Laste ned en nettside

La oss prøve å laste ned en side, for eksempel github.com:

wget github.com

Hvis tilkoblingen er i orden, vil den laste ned forsiden og vise et utdata som ligner dette:

    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]
  

Laste ned flere filer

Dette er nyttig når man trenger å laste ned flere filer samtidig, og kan gi en ide om hvordan man automatiserer filnedlastinger ved hjelp av skript.

La oss prøve å laste ned Python 3.8.1- og 3.5.1-filer:

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

Syntaksen er som følger:

wget URL1 URL2 URL3

Det er viktig å skille URL-ene med mellomrom.

Begrense nedlastingshastigheten

Dette er nyttig for å teste hvor lang tid det tar å laste ned en fil med forskjellig båndbredde.

Man kan begrense nedlastingshastigheten ved å bruke alternativet --limit-rate.

Her er resultatet av en nedlasting av en Node.js-fil:

    --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]
  

Det tok 0,05 sekunder å laste ned 13,92 MB. La oss begrense hastigheten til 500 KB:

    --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]
  

Begrenset båndbredde økte nedlastingstiden til 28 sekunder. Hvis brukere klager over langsom nedlasting, kan --limit-rate simulere problemet.

Laste ned i bakgrunnen

Nedlasting av store filer, eller å begrense hastigheten, kan ta tid. Hvis man ikke ønsker å se på terminalen mens nedlastingen pågår, kan man kjøre wget i bakgrunnen ved hjelp av argumentet -b.

    Continuing in background, pid 25430.
    Output will be written to ‘wget-log.1’.
  

Ignorer sertifikatfeil

Dette er nyttig når man skal sjekke intranettapplikasjoner som ikke har korrekt sertifikat. Wget vil som standard vise en feilmelding når sertifikatet ikke er gyldig.

    --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'.
  

I eksemplet ovenfor er sertifikatet utløpt. Wget foreslår å bruke --no-check-certificate for å ignorere sertifikatvalidering.

    --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]
  

Dette er en nyttig funksjon for å teste webapplikasjoner med ugyldige sertifikater.

Man kan også se HTTP-responsheaderen på et nettsted i terminalen. Ved å bruke -S printes headeren ut. Her er et eksempel for Coursera:

    --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]
  

Manipulere brukeragenten

Noen ganger kan det være ønskelig å koble til et nettsted med en spesifikk brukeragent, som for eksempel en nettlesers brukeragent. Dette kan gjøres med --user-agent. Her er et eksempel med en egendefinert brukeragent:

wget https://gf.dev --user-agent="MyCustomUserAgent"

Når en applikasjon fortsatt er under utvikling, kan man mangle en URL for testing. Eller man vil teste en HTTP-instans med IP-adresse, men man må legge inn et vertshode for at programmet skal fungere. I slike tilfeller kan --header være nyttig.

For eksempel, for å teste http://10.10.10.1 med vertshodet application.com, kan man bruke:

wget --header="Host: application.com" http://10.10.10.1

Det er ikke bare verten man kan manipulere, men alle slags headere.

Koble til via proxy

I et DMZ-miljø kan det hende at man ikke har direkte tilgang til internett, men man kan bruke en proxy for å koble til:

wget -e use_proxy=yes http_proxy=$PROXYHOST:PORT http://externalsite.com

Husk å erstatte $PROXYHOST:PORT med den faktiske proxy-adressen og porten.

Koble til med spesifikk TLS-protokoll

Vanligvis anbefales OpenSSL for testing av TLS-protokoller, men man kan også bruke wget:

wget --secure-protocol=TLSv1_2 https://example.com

Dette vil tvinge wget til å koble til via TLS 1.2.

Konklusjon

Kjennskap til nødvendige kommandoer kan være til stor hjelp i jobben. Forhåpentligvis gir denne artikkelen et godt innblikk i hva man kan bruke wget til.