Proxy-Nutzung mit wget: Befehle und Beispiele

Veröffentlicht:

10 Min. Lesezeit

Acar Diveroli
Autor: Acar Diveroli
Download über einen Proxy im Kommandozeilenfenster

wget ist ein unter Linux und macOS meist vorinstalliertes Kommandozeilenwerkzeug zum Herunterladen von Dateien und Abrufen von Webseiten. Es wird häufig genutzt, um auf Servern per Skript Dateien herunterzuladen, eine Website zu spiegeln oder einen einfachen Erreichbarkeitstest durchzuführen. In diesem Beitrag erklären wir drei Wege, wget über einen Proxy laufen zu lassen, die Authentifizierung, HTTPS-Details, worauf bei Massendownloads zu achten ist, und häufig auftretende Fehler mit Beispielbefehlen.

Alle beschriebenen Optionen sind im GNU-Wget-Handbuch dokumentiert.

Vor dem Start: ist wget installiert?

Prüfen Sie die Version im Terminal:

bash
wget --version

Wird der Befehl nicht gefunden, können Sie unter Debian und Ubuntu sudo apt install wget, unter macOS mit Homebrew brew install wget nutzen. Unter Windows ist wget nicht vorinstalliert; für dieselben Aufgaben können Sie das ab Windows 10 mitgelieferte curl.exe verwenden. Die wget-Schreibweise in PowerShell ist dagegen kein echtes wget, sondern ein Alias für den Befehl Invoke-WebRequest, und akzeptiert die in diesem Beitrag genannten Optionen nicht.

Bei Tests erleichtert eine Testadresse, die Ihre IP-Adresse zurückgibt, die Arbeit. Funktioniert der Proxy, zeigt diese Adresse nicht Ihre eigene, sondern die IP des Proxys:

bash
wget -qO- https://httpbin.org/ip

-q unterdrückt hier die Ausgabe, -O- gibt den heruntergeladenen Inhalt statt in eine Datei auf dem Bildschirm aus. Führen Sie den Befehl einmal ohne Proxy aus und notieren Sie Ihre eigene IP; bei folgenden Versuchen sehen Sie den Unterschied sofort.

Das Format der Proxy-Adresse

In allen drei Methoden wird der Proxy im gleichen Format angegeben:

text
http://benutzer:passwort@server:port
  • Das Schema http:// ist das Protokoll der Verbindung zum Proxy. Auch bei HTTPS-Websites wird dieses Schema verwendet; warum, erklären wir weiter unten.
  • Der Teil benutzer:passwort@ ist optional. Haben Sie über Ihr Proxy-Panel die IP Ihres Servers autorisiert, können Sie diesen Teil ganz weglassen.
  • Die Angabe server:port hängt von Ihrem Paket ab; die richtigen Werte finden Sie in Ihrem Kundenpanel.

Methode 1: mit Umgebungsvariablen

wget liest die üblichen Proxy-Umgebungsvariablen des Systems: http_proxy, https_proxy, ftp_proxy und no_proxy. Das ist die schnellste Methode, und viele andere im selben Terminal laufende Tools nutzen dieselben Variablen.

bash
export http_proxy="http://benutzer:passwort@pr.proxynet.io:8000"
export https_proxy="http://benutzer:passwort@pr.proxynet.io:8000"

wget -qO- https://httpbin.org/ip

Drei Punkte sind zu beachten:

  • Auch der Wert von https_proxy beginnt mit http://. Diese Variable gibt den beim Zugriff auf HTTPS-Websites zu nutzenden Proxy an; die Verbindung zum Proxy selbst ist HTTP, und der HTTPS-Traffic wird innerhalb dieser Verbindung getunnelt.
  • Die Variablen gelten nur in dieser Terminalsitzung. Sollen sie dauerhaft gelten, fügen Sie sie zu ~/.bashrc oder ~/.zshrc hinzu.
  • Bevorzugen Sie Kleinschreibung. wget liest die kleingeschriebenen Variablen; auf manchen Systemen kann auch großgeschriebenes HTTP_PROXY definiert sein, und widersprechen sich beide Definitionen, stiftet das Verwirrung. Am sichersten ist es, beide auf denselben Wert zu setzen.

Sollen bestimmte Adressen nicht über den Proxy gehen, nutzen Sie no_proxy:

bash
export no_proxy="localhost,127.0.0.1,.ihrefirma.local"

Diese Variable verhindert, dass Dienste im internen Netz oder lokale Entwicklungsserver über den Proxy laufen. Ein mit einem Punkt beginnender Domainname umfasst alle Subdomains dieser Domain.

Methode 2: in der Befehlszeile, einmalig

Um ohne Änderung der Umgebungsvariablen nur einen einzelnen Befehl über den Proxy zu leiten, können Sie mit der Option -e (--execute) wget-Einstellungen direkt im Befehl übergeben:

bash
wget -e use_proxy=yes \
     -e https_proxy=http://pr.proxynet.io:8000 \
     --proxy-user=benutzer \
     --proxy-password=passwort \
     https://httpbin.org/ip -O -

Diese Methode ist besonders in Skripten nützlich: Die Proxy-Einstellung beeinflusst keine anderen Befehle, und Sie können bei jedem Aufruf einen anderen Proxy angeben. Wollen Sie zum Beispiel in einer Schleife jeden Download über einen anderen Ausgangspunkt laufen lassen, beziehen Sie den Wert für -e https_proxy= aus der Schleifenvariable.

Jede mit -e angegebene Zeile ist eine Einstellung, die auch in die Datei .wgetrc geschrieben werden kann. Das heißt, jeder Schlüssel, den Sie in der folgenden Methode sehen, gilt auch hier.

Methode 3: dauerhaft mit der Datei .wgetrc

Nutzen Sie wget auf derselben Maschine dauerhaft mit einem Proxy, können Sie die Einstellungen in die Datei ~/.wgetrc in Ihrem Nutzerverzeichnis schreiben:

ini
use_proxy = on
http_proxy = http://pr.proxynet.io:8000
https_proxy = http://pr.proxynet.io:8000
proxy_user = benutzer
proxy_password = passwort

Da die Datei ein Passwort enthält, schränken Sie die Rechte so ein, dass nur Sie sie lesen können:

bash
chmod 600 ~/.wgetrc

Ist eine systemweite Einstellung nötig, können dieselben Zeilen in die Datei /etc/wgetrc geschrieben werden; die Datei im Nutzerverzeichnis überschreibt dabei die Werte der Systemdatei.

Wollen Sie den Proxy bei bestehender Datei vorübergehend deaktivieren, fügen Sie für einen einzelnen Befehl die Option --no-proxy hinzu:

bash
wget --no-proxy https://httpbin.org/ip -O -

Welche Methode sollte man wählen?

SituationEmpfohlene Methode
Schneller Test im TerminalUmgebungsvariable
Im Skript, bei jedem Aufruf ein anderer ProxyBefehlszeile mit -e
Dauerhafte Proxy-Nutzung auf dem Server.wgetrc
Bestimmte Adressen vom Proxy ausnehmenno_proxy
Geplanter Download per Cron.wgetrc (Cron überträgt keine Umgebungsvariablen)
Innerhalb eines Docker-ContainersUmgebungsvariable (über ENV)

Sind alle drei Methoden gleichzeitig definiert, gilt folgende Rangfolge: Befehlszeilenoptionen überschreiben Umgebungsvariablen, Umgebungsvariablen überschreiben die Datei .wgetrc.

Wie funktioniert der Proxy bei HTTPS-Websites?

Beim Zugriff auf eine HTTPS-Adresse über einen Proxy sendet wget dem Proxy zunächst eine CONNECT ziel:443-Anfrage. Der Proxy öffnet eine TCP-Verbindung zum Ziel und überträgt danach nur noch verschlüsselte Bytes. Der Proxy sieht also nicht den Inhalt der Website, sondern nur, mit welchem Domainnamen sich verbunden wird.

Die praktische Folge: Auch wenn die Proxy-Adresse mit http:// beginnt, können Sie sicher HTTPS-Websites ansteuern. Die Zertifikatsprüfung erfolgt zwischen Ihrer Maschine und der Zielseite, der Proxy ist daran nicht beteiligt. Dieses Verhalten des Proxys und den Unterschied zu SOCKS haben wir in unserem Beitrag SOCKS und HTTP Proxy im Vergleich verglichen.

In Kombination mit häufig genutzten Optionen

Die Proxy-Einstellung allein reicht in der Praxis selten aus; für echte Aufgaben braucht es meist einige Optionen mehr. Das folgende Beispiel lädt eine Datei über den Proxy mit Wiederholungs- und Timeout-Einstellungen herunter:

bash
wget --timeout=30 --tries=3 --waitretry=5 \
     --user-agent="Mozilla/5.0 (X11; Linux x86_64)" \
     -O bericht.pdf https://example.com/bericht.pdf
  • --timeout begrenzt die Wartezeit für jeden Netzwerkvorgang.
  • --tries legt fest, wie oft ein fehlgeschlagener Download wiederholt wird; --waitretry fügt zwischen den Versuchen eine Wartezeit ein.
  • --user-agent ändert die Browserkennung. wgets Standardkennung wird auf manchen Websites direkt blockiert; ein aussagekräftiger Wert ist sowohl transparenter als auch weniger problematisch.
  • -O benennt die Ausgabedatei; mit -c wird ein unterbrochener Download an der Stelle fortgesetzt, an der er abgebrochen wurde.

Brauchen Sie beim Abrufen der Seite Cookies, halten die Optionen --load-cookies und --save-cookies die Sitzung in einer Datei fest; so lässt sich eine angemeldete Sitzung zusammen mit dem Proxy fortsetzen.

Unterstützt wget SOCKS-Proxy?

GNU Wget hat keine eingebaute SOCKS-Unterstützung; alle oben genannten Methoden sind für HTTP- und HTTPS-Proxy gedacht. Brauchen Sie SOCKS5, haben Sie zwei Optionen:

  • cURL nutzen. cURL unterstützt die Schemata socks5:// und socks5h:// direkt und kann fast alles, was wget kann. Details in unserem Beitrag Wie nutzt man einen Proxy mit cURL?.
  • Ein Umleitungstool nutzen. Unter Linux können Tools wie proxychains die Verbindungen von Programmen ohne SOCKS-Unterstützung zum SOCKS-Proxy umleiten. Unter Windows erledigt das Proxifier.

Für mit wget direkt funktionierende Pakete lohnt sich ein Blick auf die Seite HTTPS-Proxy.

Häufige Fehler und ihre Lösungen

"407 Proxy Authentication Required"

Die Proxy-Zugangsdaten fehlen oder sind falsch. Prüfen Sie Benutzername und Passwort. Enthält das Passwort Sonderzeichen wie @, : oder #, kodieren Sie diese in der Adresse mit Prozentkodierung (@ wird zu %40), oder nutzen Sie die Optionen --proxy-user und --proxy-password; diese Optionen erfordern keine Kodierung.

Der Befehl nutzt den Proxy überhaupt nicht

  • Stellen Sie sicher, dass Sie die Variable mit export definiert haben; nur http_proxy=... zu schreiben, überträgt sie nicht an Unterprozesse.
  • Gehen Sie an eine HTTPS-Adresse, muss nicht http_proxy, sondern https_proxy definiert sein.
  • Prüfen Sie, ob in .wgetrc eine Zeile use_proxy = off steht.
  • Führen Sie sudo wget aus, überträgt sudo standardmäßig möglicherweise nicht Ihre Umgebungsvariablen; nutzen Sie sudo -E, um sie zu übertragen, oder schreiben Sie die Einstellung in /etc/wgetrc.
  • Die Zieladresse könnte mit einer Domain in der no_proxy-Liste übereinstimmen.

"Unable to establish SSL connection"

Prüfen Sie zunächst, ob sich die Zieladresse ohne Proxy öffnen lässt. Liegt das Problem am Zertifikat, überspringt die Option --no-check-certificate die Prüfung; diese Option schwächt jedoch die Sicherheit der Verbindung und sollte nur zu Testzwecken genutzt werden. Denken Sie daran, dass der Proxy an der Zertifikatsprüfung nicht beteiligt ist: Dieser Fehler stammt meist von einem veralteten Root-Zertifikatsspeicher im System oder von der Konfiguration der Zielseite.

Die Verbindung läuft in ein Timeout

Prüfen Sie Proxy-Adresse und Port erneut. Stellen Sie sicher, dass die Firewall Traffic zum Proxy-Port zulässt. Bei langen Downloads verhindert es, dass Skripte hängen bleiben, wenn Sie Timeout und Wiederholungsanzahl explizit festlegen:

bash
wget --timeout=30 --tries=3 https://httpbin.org/ip -O -

"ERROR 403: Forbidden"

Die Zielseite lehnt die Anfrage ab. Die Ursache muss nicht der Proxy sein; wgets Standard-User-Agent wird auf manchen Websites direkt blockiert. Geben Sie mit --user-agent einen aussagekräftigen Wert an. Besteht das Problem weiter, könnte sich die Zielseite je nach IP-Typ des Proxys unterschiedlich verhalten; warum Rechenzentrumsadressen häufiger abgelehnt werden, haben wir in Residential- und Datacenter-Proxy im Vergleich erklärt.

Worauf bei Massendownloads zu achten ist

Die Option -r (rekursiver Download) von wget kann eine ganze Website mit einem einzigen Befehl herunterladen. Diese Kraft kann den Zielserver stark belasten. Bei Massendownloads sind folgende Optionen sowohl für Sie als auch für das Ziel von Vorteil:

bash
wget -r -l 2 --wait=2 --random-wait --limit-rate=500k \
     --no-parent -A pdf https://example.com/dokumente/
  • -l 2 begrenzt die Tiefe auf zwei Ebenen; unbegrenzte Tiefe lädt die gesamte Website herunter.
  • --wait=2 fügt zwischen Anfragen zwei Sekunden ein, --random-wait variiert diese Zeit zufällig.
  • --limit-rate=500k begrenzt die Downloadgeschwindigkeit.
  • --no-parent verhindert das Aufsteigen in übergeordnete Verzeichnisse, -A pdf lädt nur die angegebene Dateiendung.

wget folgt standardmäßig den Regeln der robots.txt; deaktivieren Sie dieses Verhalten nicht. Welche Daten unter welchen Bedingungen erfasst werden dürfen, haben wir in Ist Web Scraping legal? erklärt.

Bei Projekten mit vielen Anfragen senkt es sowohl das Sperrungsrisiko als auch die Last der Zielseite, statt den Traffic auf eine einzige IP zu häufen, mit Rotierender Proxy die Adressen zu verteilen. Für umfangreichere Bedürfnisse können Sie sich unsere Datenerfassungslösungen ansehen.

Häufig gestellte Fragen

wget oder cURL?

Für Dateidownload, Spiegelung und rekursiven Abruf ist wget praktischer; für API-Anfragen, spezielle HTTP-Methoden und SOCKS-Proxy ist cURL leistungsfähiger. Beide lesen HTTP-Proxy aus denselben Umgebungsvariablen; eine einmal definierte Einstellung funktioniert also in beiden Tools.

Beeinflusst die Proxy-Einstellung andere Programme?

Ein per Umgebungsvariable definierter Proxy beeinflusst jedes Programm, das aus derselben Shell gestartet wird und diese Variablen liest (cURL, pip, git und andere). Die Methoden .wgetrc und -e beeinflussen nur wget.

Kann ich einen Proxy nutzen, ohne mein Passwort zu speichern?

Ja. Autorisieren Sie über das Panel Ihres Proxy-Anbieters die IP-Adresse Ihres Servers, sind Benutzername und Passwort nicht nötig; die Adresse wird dann nur im Format http://server:port geschrieben. Für Server mit fester IP ist das der sauberste Weg.

Kann ich mit wget bei jeder Anfrage eine andere IP erhalten?

wget selbst rotiert nicht. Es gibt zwei Wege: einen Rotating-Proxy nutzen (eine Adresse, bei jeder Verbindung eine andere ausgehende IP) oder in einem Skript bei jedem Aufruf mit -e https_proxy= einen anderen Proxy angeben.

Kann ich per Proxy per FTP herunterladen?

Ist die Variable ftp_proxy definiert, ruft wget FTP-Adressen über den HTTP-Proxy ab; der Proxy muss diese Nutzung unterstützen. Da FTP-Quellen heute seltener werden, konzentrieren sich die meisten Proxy-Pakete auf HTTP und HTTPS.

Fazit

Es gibt drei Wege, wget mit einem Proxy zu nutzen: Umgebungsvariablen für schnelle Tests, die Option -e für einmalige Nutzung in Skripten und die Datei .wgetrc für dauerhafte Nutzung. Vergessen Sie nicht, für HTTPS-Adressen https_proxy zu definieren, Zugangsdaten sicher aufzubewahren, bei Massendownloads die Geschwindigkeit zu begrenzen und bei Bedarf für SOCKS zu cURL zu wechseln.

ChatGPT fragenClaude fragen