wget gebruiken om bestanden te downloaden

Redactie
0

Inhoudsopgave

Met het piepkleine programma wget kun je eenvoudig vrij complexe downloads uitvoeren. Zodra je eenmaal weet hoe het werkt, vraag je je af hoe je ooit zonder kon.

Als je in de browser op een downloadlink klikt, haalt je browser het bestand binnen. Wordt de verbinding vlak voor het eind om welke reden dan ook verbroken, dan moet je het bestand vaak helemaal opnieuw downloaden. Erg irritant bij grote bestanden.

De kleine commandlinetool wget biedt uitkomst. Het tooltje is gespecialiseerd in het downloaden van bestanden. Wget kan afgebroken downloads voortzetten, complete websites spiegelen en bestanden via een beveiligde HTTPS-verbinding binnenhalen. Daarnaast kan de tool mappen op een server recursief benaderen, de bandbreedte beperken en het automatisch nog een keer proberen als een server overbelast is. Ook kun je wget als commandlinetool goed in een eigen shellscript inbouwen of combineren met andere toepassingen.

Wget zit standaard al in alle zichzelf respecterende Linux-distributies. Als je een terminal opent en wget --help intypt, toont de tool een uitgebreide online hulp. Krijg je een foutmelding, dan kun je wget normaal gesproken via de packetmanager installeren. Voor Windows staan er kant-en-klare installatiepakketten op de projectsite bij Sourceforge – ten opzichte van de originele pakketten lopen de versienummers af en toe wel wat achter. Jernej Simončič zet nieuwere versies op zijn website. Het Rudix-project biedt installatiepakketten aan voor macOS. Je kunt de tool ook via Homebrew installeren met het commando brew install wget.

Wget maakt onderdeel uit van het GNU-project en staat onder de GNU General Public License v3. De broncode vind je op de site van het project.

Downloaden

Als je achter wget een url zet, downloadt de tool het gewenste bestand. Met onderstaand voorbeeld wordt een ISO-image van Ubuntu Desktop 16.10 binnengehaald:

wget http://releases.ubuntu.com/16.10/ubuntu-16.10-desktop-amd64.iso

Wget laat elke actie zien en geeft ook aan waarom een verbinding werd verbroken of crashte. Als een server naar een andere url doorlinkt (bijvoorbeeld met de melding ‘301 Moved Permanently’), volgt wget die omleiding en wordt het bestand via dat adres gedownload. In de uitvoer zie je dan waar die omleiding heengaat. Met de parameter -nv toont wget alleen de belangrijkste informatie; met -q zie je helemaal geen informatie meer. Als je parameters gebruikt, moet de url altijd aan het eind van een commando staan.

Wget kan zijn werk met de parameter -b ook stilletjes op de achtergrond uitvoeren. De schermuitvoer kun je daarbij omleiden naar een bestand door voor de bestandsnaam -o te zetten, in het voorbeeld hieronder is dat ‘log.txt’:

wget -b -o log.txt http://releases.ubuntu.com/16.10/ubuntu-16.10-desktop-amd64.iso

Wget geeft uitvoerig aan wat het momenteel aan het doen is en hoe lang die actie waarschijnlijk nog duurt.

Wget geeft uitvoerig aan wat het momenteel aan het doen is en hoe lang de actie waarschijnlijk nog duurt.

Wordt vervolgd

Downloads zijn op elk moment met Ctrl+C af te breken. Het incomplete bestand blijft op de schijf achter. Hetzelfde gebeurt als de verbinding werd verbroken. Wget gaat door met downloaden waar hij gebleven was als je de tool de daaropvolgende keer uitvoert met de extra parameter -c:

wget -c http://ftp.snt.utwente.nl/pub/linux/ubuntu-releases/16.10/ubuntu-16.10-desktop-amd64.iso

Zoals uit het voorbeeld blijkt, mag je hierbij ook een andere server gebruiken. Het bestand hoeft alleen dezelfde naam te hebben en de inhoud moet identiek zijn. Als ubuntu.com dus onbereikbaar mocht zijn, kun je de rest van het bestand gewoon van de server van de Universiteit Twente halen. Dat werkt ook als je voor het downloaden van het eerste deel van het bestand een andere tool gebruikte.

Laat je de -c weg, dan start wget de hele download weer van voren af aan. Het bestaande bestand wordt dan niet vervangen, maar er wordt aan het nieuwe bestand een cijfer toegevoegd, bijvoorbeeld ‘ubuntu.iso.1’. Er zit echter een addertje onder het gras: als een bestand niet compleet gedownload is, kan het origineel op de server door een update ‘s nachts wellicht groter zijn geworden. Als je het vervolgens met wget -c verder downloadt van de server, voegt de tool het eind van het grotere bestand toe aan het lokale bestand.

Wget kan ook overweg met ftp-servers. Bij anonieme ftp-servers hoef je alleen maar de url aan het commando toe te voegen. Als je je bij een ftp-server moet aanmelden met een gebruikersnaam en wachtwoord, zet je de toegangsgegevens in de bijbehorende parameters. Hieronder staat hoe gebruiker ‘tim’ zich aanmeldt met het wachtwoord ‘123’:

wget --user=tim --password=123 ftp://ftp.example.com/ubuntu.iso

Als een download onderbroken werd, kan wget hem via een andere server voortzetten. De plustekens in de voortgangsbalk geven het deel aan dat al eerder gedownload was.

Als een download onderbroken werd, kan wget hem via een andere server voortzetten. De plustekens in de voortgangsbalk geven het deel aan dat al eerder gedownload was.

Placeholders

Dat leidt overigens wel tot een beveiligingsprobleem. In het overzicht van processen, dat andere gebruikers met bijvoorbeeld ps -A kunnen aanroepen, staat het bovenstaand commando – en daarmee dus ook het wachtwoord – als platte tekst. Om dat te voorkomen, vervang je de parameter --password=WACHTWOORD door --askpassword. Wget vraagt dan pas naar het wachtwoord als de verbinding gemaakt wordt. Je kunt de toegangsgegevens ook opslaan in het configuratiebestand .wgetrc – met de instellingen ‘user=’ en ‘passwd=’ (meer over dit bestand kun je onderaan lezen bij ‘Het configuratiebestand .wgetrc’). Je moet er dan wel voor zorgen dat je dat bestand als enige kunt lezen. Die methode is met name handig als je wget in een shellscript wilt integreren.

Bij een ftp-verbinding mag je bekende placeholders als ‘*’ en ‘?’ gebruiken. Daarmee wordt het mogelijk om bijvoorbeeld alle bestanden met de extensie .iso te downloaden.

wget ftp://ftp.snt.utwente.nl/pub/linux/ubuntu-releases/16.10/*.iso

Als je alle bestanden in één keer wilt downloaden, hoef je aan het eind van de url alleen * te zetten. Laat je het sterretje weg (of vergeet je het), dan downloadt wget geen bestanden. De tool haalt dan de namen op van alle bestanden op de server en bewaart die in een html-bestand op je computer. Je krijgt dus alleen een overzicht van de inhoud van de map.

Wil je niet met placeholders werken, dan kun je de url’s van alle benodigde bestanden ook kopiëren naar het tekstbestand urls.txt. Elke url moet daarbij op een eigen regel komen te staan. Als je die lijst vervolgens met wget -i urls.txt gebruikt, downloadt de tool alle bestanden.

Alleen nieuwe bestanden

Als je telkens dezelfde bestanden moet downloaden, bespaar je met de parameter -N tijd en bandbreedte. Wget vergelijkt alle bestaande bestanden met die op de server en downloadt dan eerst alle bestanden die nog niet op de harde schijf staan. Als het bestand op de server groter of recenter is, wist wget het lokale bestand en wordt de nieuwere versie gedownload. In de documentatie van wget staat die methode bekend als timestamping. Op die manier kun je bestanden op een server regelmatig spiegelen zonder telkens alle bestanden te hoeven downloaden.

Recursief

De parameter -r geeft wget de opdracht de submappen recursief in te duiken en daar alle bestanden te downloaden. Met het volgende voorbeeld download je alle Ubuntu-installatiemedia van de ftp-server van de Universiteit Twente:

wget -r -l 2 ftp://ftp.snt.utwente.nl/pub/linux/ubuntu-releases/

Standaard gaat wget daarbij maximaal vijf mapniveaus diep. De parameter -l overschrijft die instelling. In het voorbeeld hierboven gaat wget hooguit tot twee niveaus. Met -l inf hef je die beperking op en doorzoekt wget alle submappen – tot het niet meer verder kan. Sommige ftp-servers werken met symbolische links die naar andere mappen of bestanden verwijzen. Dan worden alleen de bestanden gedownload. Als de link naar een map verwijst, volgt wget die niet. De ontwikkelaars van wget passen dat bij een nieuwe versie wellicht aan.

Webpagina’s archiveren

Als de opgegeven url een webpagina is, downloadt wget gewoon de hele pagina. Indien je die pagina alleen met een gebruikersnaam en wachtwoord kunt opvragen, gebruik je daar weer --user= en --password= voor. WordPress en andere cms’en maken hun pagina’s dynamisch aan. Dergelijke pagina’s eindigen niet op ‘.html’. Met de extra parameter -E voegt wget die extensie automatisch toe aan opgeslagen bestanden.

Wget kan ook webpagina’s via HTTPS en sinds versie 1.7 ook bestanden via FTPS downloaden:

wget https://nl.wikipedia.org/

Wget controleert automatisch het door de server verstrekte certificaat. Als daarin iets niet klopt, wordt de verbinding verbroken. Je kunt die controle uitschakelen met de parameter --no-check-certificate. Praktisch als een pagina of FTPS-server bijvoorbeeld met een zelfondertekend certificaat werkt. Met de parameter --secure-protocol=TLSv1_2 kun je bovendien SSL respectievelijk TLS afdwingen. In bovenstaand voorbeeld zou dat TLS v1.2 zijn – erg handig voor als je een webpagina van een oudere of buggy server wilt downloaden. Met de parameter --secure-protocol=PFS is daarnaast nog het gebruik van Perfect Forward Secrecy af te dwingen.

Als je een webpagina downloadt, wordt alleen het html-bestand op de harde schijf gezet – niet de afbeeldingen en css-bestanden. Om ook die content op te slaan, moet je nog de parameter -p toevoegen. De parameter -k of --convert-links zet alle relatieve links in het html-bestand zodat ze ook lokaal werken. Om een offline versie van de startpagina van het GNU-project te downloaden, kun je dus het volgende ingeven:

wget -p -k https://www.gnu.org

Sommige websites als https://www.wikipedia.org of www.surface.nl, sturen wget door naar een andere (sub) pagina. In dat geval downloadt wget zelfs met -p -k alleen het pure html-bestand van die redirection. Wil je in dergelijke gevallen alleen de startpagina compleet downloaden, dan moet je er -r bij zetten.

Subpagina’s downloaden

De parameters -r en -l werken ook als je webpagina’s spiegelt. Wget downloadt dan niet alleen de gewenste webpagina, maar naast de startpagina ook alle overige pagina’s waarnaar gelinkt wordt. De combinatie -r -l 1 is echter niet hetzelfde als de parameter -p: met die laatste download je alle bestanden die nodig zijn om de pagina weer te geven, maar bij -r -l hoeft dat niet per se het geval te zijn. Wel kun je -p combineren met beide andere parameters:

wget -p -r -l 1 -k https://www.gnu.org

Wget downloadt dan eerst de startpagina van het GNU-project inclusief alle afbeeldingen. Daarna gaat de tool op zoek naar alle links en komen de pagina’s met alle afbeeldingen aan de beurt. Zonder -p zou wget de gelinkte pagina’s alleen als pure html-bestanden opslaan. Tenslotte zorgt -k er voor dat de gedownloade pagina’s ook offline leesbaar worden.

Wget hanteert op de harde schijf dezelfde mapstructuur als op de server. Alle bestanden en submappen komen in een map terecht die de naam van de server heeft. In het voorbeeld hierboven staat alles wat gedownload is in de map ‘www.gnu.org’. Met de parameter -nH zet wget alle bestanden in de huidige map.

Afbeeldingen van een webpagina

Wil je alleen alle afbeeldingen van een bepaalde webpagina downloaden, dan zou je denken dat je dat dan met wget http://www.gnu.org/*.jpg kunt doen. Maar helaas werken placeholders als * niet met HTTP-adressen. Daar moet je het volgende voor intypen:

wget -r -l 1 -A jpg,jpeg,png,gif http://www.gnu.org

De parameter -A geeft de instructie alleen de bestanden te downloaden met een van de extensies die erachter staan. In het voorbeeld gaat wget eerst naar de webpagina en spoort daar alle directe links op (-r -l 1). Alleen bestanden die eindigen op jpg, jpeg, png en gif worden opgeslagen. Daarbij komen er dus meer data binnen dan dat er uiteindelijk op de harde schijf belanden. Dat werkt ook bij ftp-verbindingen. Het commando wget -r -A iso ftp://ftp.snt.utwente.nl/pub/linux/ubuntu-releases/16.10/ downloadt bijvoorbeeld alle iso-bestanden. Met de parameter -R kun je op dezelfde manier ook bestanden uitsluiten. Dan downloadt wget met het commando -R mp4,webm,torrent bijvoorbeeld geen grote video’s in MP4- en WEBM-formaat en ook geen onbelangrijke torrent-bestanden.

Spiegelen

Wget kan de content van een complete server spiegelen naar de lokale harde schijf. Dat is handig als je html-pagina’s offline wilt lezen of om snel even een back-up van je ftp-server te maken. Met het onderstaande voorbeeld haal je de complete inhoud van de server releases.ubuntu.com lokaal binnen:

wget -m http://releases.ubuntu.com

De parameter -m levert ftp-maplijsten, ondersteunt timestamping en downloadt mappen recursief tot alle niveaus. De hoeveelheid data kan daarbij enorm oplopen. Zorg er dus voor dat je genoeg vrije ruimte op je harde schijf hebt. Bovendien belast wget de server voor langere tijd. Gebruik wget -m kortom met beleid. Als je wget -m een tweede keer oproept, downloadt de tool overigens alleen de bestanden die gewijzigd zijn. Dat gedraagt zich dus hetzelfde als met de parameter -N. Spiegelen met wget is vooral handig als je een server wilt back-uppen. Op systemen met Linux kun je zoiets beter met een cronjob uitvoeren.

Snelheidsbeperking

Standaard gebruikt wget de hele beschikbare bandbreedte. Bij grotere downloads kunnen de data echter ook met minder bytes per seconde gedownload worden, zodat er meer overblijft voor andere programma’s. Met de parameter --limit-rate stel je de maximale snelheid in die wget mag gebruiken. Met --limit-rate=50k downloadt wget de data met maximaal 50 kB per seconde, met --limit-rate=10m is dat 10 MB per seconde.

Als je een databundel of een beperkte opslagruimte hebt, is de parameter -Q handig. Je geeft wget daarmee opdracht de download na een bepaalde datahoeveelheid te annuleren. Met -Q 100m stopt de tool na 100 MB automatisch. Wget negeert de parameter -Q als je hebt aangegeven een concreet bestand te willen downloaden.

Zoals aangegeven is wget hier na 10 kB gestopt met downloaden.

Zoals aangegeven is wget hier na 10 kB gestopt met downloaden.

Links controleren

Sinds versie 1.7 ondersteunt wget ook de parameter --spider. Daarmee controleert wget wel of de genoemde url’s bestaan, maar worden de bestanden niet gedownload. Je kunt dat gebruiken om je bookmarks te controleren:

wget --spider --force-html -i bookmarks.html

De parameter --force-html vertelt wget dat de links in een html-bestand staan. In Firefox maak je het bijbehorende bestand (bookmarks.html) aan door in het bookmarkbeheer de bladwijzers te exporteren naar html.

Hier controleert wget enkele bladwijzers. Als een server de toegang weigert, bestempelt wget de bijbehorende url als ongeldig – zoals in het voorbeeld onderaan.

Hier controleert wget enkele bladwijzers. Als een server de toegang weigert, bestempelt
wget de bijbehorende url als ongeldig – zoals in het voorbeeld onderaan.

Finetuning

Wget biedt nog veel meer parameters dan hier besproken, met name voor het maken van de verbinding. Je kunt met --dns-servers bijvoorbeeld een alternatieve DNS-server opgeven en met -U de user-agent manipuleren. Wget kan zich daarmee bijvoorbeeld voordoen als Firefox. In de officiële documentatie staan alle parameters uitvoerig beschreven. Op de website van wget staat die in meerdere formaten.

Het configuratiebestand .wgetrc

Als je wget vaak met dezelfde parameters gebruikt, kun je die het beste opslaan in het bestand .wgetrc (let op de punt ervoor). Dat bestand bevindt zich bij Unix-systemen in de home-directory. Ontbreekt het daar, dan maak je gewoon een nieuw bestand aan. Bij de officiële wget-documentatie staat een voorbeeld.

De voorbeeldconfiguratie heeft instellingen voor nagenoeg elke wget-parameter op de commandline. De regel verbose = off komt bijvoorbeeld overeen met de parameter -nv. Wget laat dan alleen beknopte informatie zien. Elke instelling krijgt een eigen regel, achter het isgelijkteken zet je de gewenste waarde. Wget negeert alle uitgecommentarieerde regels (met de hash-tag #). Om die te activeren, hoef je dus alleen maar het hekje te verwijderen.

Je kunt de instellingen in het bestand .wgetrc op de commandline overschrijven met eigen parameters. Waarden die voor het hele systeem gelden, worden in een ander configuratiebestand opgeslagen – afhankelijk van het systeem en de distributie is dat bij Linux in /etc/wgetrc of /usr/ local/etc/wgetrc.

In het configuratiebestand .wgetrc kun je een gebruikersnaam en wachtwoord invoeren. wget gebruikt beide dan standaard als toegangsgegevens voor FTP- en HTTP-servers.

In het configuratiebestand .wgetrc kun je een gebruikersnaam en wachtwoord invoeren. wget gebruikt beide dan standaard als toegangsgegevens voor FTP- en HTTP-servers.

 

(Tim Schürmann / Marcel van der Meer)

Deel dit artikel

Lees ook

Met Raspberry Pi port knocking de computers in je netwerk beveiligen

Iedereen die een computer of server met het openbare internet verbindt, wordt al snel het doelwit van hackers. Sommige wetenschappers gaan ervan uit d...

TeamViewer op Ubuntu installeren & gebruiken: zo werkt het

In dit artikel tonen we hoe je op afstand je Linux-computer met Ubuntu kunt beheren door TeamViewer te gebruiken. Voor degenen die niet bekend zijn me...

0 Praat mee
avatar
  Abonneer  
Laat het mij weten wanneer er