cURL in Linux: Wissenswertes zum Einstieg

Die freie Software cURL ist eines der ältesten und beliebtesten Open-Source-Projekte. Das in C geschriebene Programm dient dem Versenden von Daten in Computernetzwerken. Dabei steht der Name cURL für „client URL”. Die offene Lizenz räumt das Recht der Nutzung für jedwede Zwecke ein. Aktuell wird cURL in unzähligen Geräten verwendet.

Was ist cURL?

Die Software cURL umfasst zwei Komponenten. Die Programmbibliothek libcurl dient dabei als Rückgrat für den eigentlichen Datentransfer und unterstützt die folgenden Protokolle:

Das Kommandozeilenprogramm cURL agiert hingegen als textbasierte Schnittstelle und interagiert über die Kommandozeile mit libcurl.

Das Programm ist ein wichtiges Tool für die Webentwicklung. Denn es erlaubt dem Entwickler, direkt mit Servern zu kommunizieren, statt über einen Browser gehen zu müssen. Auf cURL-Befehlen (oder auch Englisch: cURL commands) aufbauende Skripte werden zur Automatisierung von Prozessen, sowie zum Testen und Debuggen verwendet.

Wie funktioniert cURL?

Die beiden Komponenten von cURL funktionieren auf unterschiedliche Weise.

Wie wird libcurl verwendet?

Die Programmbibliothek libcurl stellt Funktionalitäten zum Versenden von Daten in Computernetzwerken bereit. Es existieren „Language Bindings” (übersetzt bedeutet das so viel wie „Sprachanbindungen”) für dutzende beliebte Programmiersprachen. So werden die Funktionen von libcurl für eine große Anzahl an Software, die mit Servern kommuniziert, nutzbar gemacht.

Wie wird cURL verwendet?

Das Kommandozeilenprogramm cURL dient der Webentwicklung. Die einfachste Methode ist, cURL-Befehle in die Kommandozeile einzugeben. Mit dem entsprechenden Know-how lassen sich so Server und APIs testen und debuggen.

Anstatt die Befehle per Hand in die Kommandozeile einzugeben, kann man diese auch in Skripten bündeln. So lassen sich aufwendige Operationen standardisieren und automatisieren. Das gilt für das Hoch- und Herunterladen von Daten ebenso wie für das programmatische Ausfüllen von Formularen und das Spiegeln ganzer Websites.

Das Schema eines cURL-Befehls sieht im Allgemeinen folgendermaßen aus:

# Generelles Schema eines cURL-Befehls
curl [Optionen] <url>

Wir verwenden in den untenstehenden Beispielen die folgende Form:

# Die folgende URL "curlen"
url="www.example.com"
curl [Optionen] "$url"

Wir haben die eigentliche URL in eine Variable ausgelagert. So wird der Fokus auf die Optionen gelenkt. Die Optionen bestimmen die Funktionsweise des cURL-Aufrufs.

Praktische Beispiele des cURL-Befehls unter Linux

Um die folgenden cURL-Beispiele nutzen zu können, benötigen Sie:

  1. Einen Computer mit Linux oder UNIX-ähnlichem Betriebssystem — inklusive macOS.
  2. Zugang zur Konsole bzw. zur Kommandozeile.
  3. Einen Code-Editor/„Plain Text”-Editor zum Komponieren von Befehlen.
Hinweis

Nutzen Sie zum Komponieren von Befehlen ausschließlich einen Code-Editor/„Plain Text”-Editor. Keinesfalls sollten Sie Textverarbeitungssoftware wie Word, OpenOffice oder LibreOffice nutzen, um Text für die Kommandozeile vorzubereiten.

Ein erster Test mit cURL

Testen Sie zunächst, ob cURL auf Ihrem System installiert ist. Öffnen Sie dazu eine Kommandozeile und fügen Sie dort den folgenden Befehl ein. Gegebenenfalls müssen Sie noch Enter drücken, damit der Code ausgeführt wird.

# Sehen, ob cURL installiert ist
curl --version

Wenn Ihnen nun ein Text beginnend mit 'curl' und einer Versionsnummer angezeigt wird, ist cURL installiert. Sollte cURL nicht installiert sein, folgen Sie bitte den Anweisungen von „Everything curl”, um das Programm zu installieren.

Tipp

Nutzen Sie die Befehle 'curl --help' und 'curl --manual', um mehr über den cURL-Befehl zu erfahren.

Zusätzlich sollten Sie in einem Code-Editor ein neues Dokument öffnen. Sie können dorthin Befehle kopieren, um sie für den Einsatz auf der Kommandozeile vorzubereiten. Wenn der Befehl fertig ist, kopieren Sie ihn in die Kommandozeile und führen Sie ihn dort aus.

Hinweis

Auf der Kommandozeile verwendete Befehle sind sehr mächtig. Ein falsch eingegebener Befehl kann prinzipiell das gesamte System lahmlegen. Daher sollte man Befehle aus dem Internet nicht einfach kopieren und auf der heimischen Kommandozeile ausführen. Stattdessen bietet es sich an, in einem Code-Editor ein leeres Fenster offen zu haben. Dorthin werden die Befehle zunächst kopiert. Durch diesen Zwischenschritt zwingen Sie sich zu einer kurzen Pause. Sie können dann jeden Befehl überprüfen und gegebenenfalls anpassen, bevor Sie ihn ausführen.

Dateien mit cURL herunterladen

Daten mit cURL vom Server abrufen

Prinzipiell können Sie mittels cURL jede Ihnen bekannte URL abrufen. In diesem Zusammenhang wird der Begriff „curlen” als Verb verwendet und beschreibt das Ansprechen einer URL mit cURL. Testen Sie das folgende Beispiel:

# Die folgende Site "curlen"
site="www.google.com"
curl "$site"

Wenn Sie den Code so ausführen, wird „Datensalat” ausgeben. Das liegt daran, dass als Antwort auf den cURL-Zugriff die Google-Homepage in HTML zurückgegeben wird. Der HTML-Quelltext wird ohne Formatierung direkt auf der Kommandozeile angezeigt. Zur korrekten Darstellung ist allerdings ein Browser erforderlich. Nützlicher ist es meist, die Datei lokal zu speichern.

Tipp

Benutzen Sie auf der Kommandozeile den Befehl 'clear', um den Bildschirm zu leeren. So werden Sie störende Datenmengen auf der Kommandozeile wieder los.

Datei mit cURL abrufen und lokal speichern

Laden wir ein Logo der englischen Wikipedia herunter. Die Option '-O' (großes o, keine Null) leitet cURL an, den am Ende der URL befindlichen Namen der Datei zu nutzen. Mit dieser Option wird cURL die heruntergeladene Datei unter demselben Namen lokal speichern.

# Ein Bild der englischen Wikipedia
datei="https://en.wikipedia.org/static/images/project-logos/enwiki-2x.png"
# Das Bild abrufen und unter demselben Namen lokal speichern
curl "$datei" -O

Wie verhält es sich jedoch mit einer URL, die keinen Dateinamen enthält? Testen Sie den folgenden Code:

# Google Homepage
homepage="www.google.com"
# Die Homepage mit Option -O abrufen
curl "$homepage" -O

Wie Sie sehen, wird ein Fehler ausgegeben, da die URL der Google-Homepage keinen Dateinamen enthält. Nutzen Sie in diesem Fall die Option '-o' (kleines o), um selber einen Dateinamen zu vergeben:

# Google Homepage
homepage="www.google.com"
# Name für die zu schreibende Datei
name="homepage-google.html"
# Die Homepage abrufen und unter dem gewählten Namen lokal speichern
curl "$homepage" -o "$name"

Download mit cURL fortsetzen, falls unterbrochen

Vielleicht haben Sie den ärgerlichen Fall schon einmal erlebt: ein großer Download läuft stundenlang und bricht dann plötzlich ab, und Sie müssen von vorne beginnen. In diesem Fall hilft cURL mit der Option '-C-' weiter:

# Eine große Datei (humanes Genom) zum Herunterladen
datei="https://ftp.ncbi.nih.gov/genomes/refseq/vertebrate_mammalian/Homo_sapiens/reference/GCF_000001405.39_GRCh38.p13/GCF_000001405.39_GRCh38.p13_genomic.gbff.gz"
# Download fortsetzen, falls unterbrochen
curl -C- -O "$datei"
Hinweis

Streng genommen lautet die Option '-C -', mit einem Leerzeichen nach dem C. Besser lesbar und einfacher zu merken ist die gleichwertige Schreibweise '-C-', die wir hier verwenden.

Sie können einen mit cURL gestarteten Download bei Bedarf auch manuell abbrechen. Insbesondere bei großen Dateien ist dies von Vorteil, beispielsweise, wenn Sie das Haus verlassen und den Laptop mitnehmen müssen.

Tipp

Sie können den laufenden Aufruf von cURL abbrechen. Drücken Sie zum Abbrechen Ctrl+C, gegebenenfalls auch mehrmals.

Mittels cURL mit dem Server kommunizieren

Die Download-Funktionalität von cURL ähnelt der des beliebten Kommandozeilen-Tools wget. Jedoch ist cURL nicht auf Downloads spezialisiert, sondern für die generelle Kommunikation in Netzwerken ausgelegt. Daher kann cURL noch einiges mehr.

Mit cURL testen, ob ein Server erreichbar ist

Sie können mit cURL testen, ob ein Server erreichbar ist. Dahingehend ähnelt die Funktionsweise von cURL der des Ping-Befehls. Jedoch ist cURL aufgrund der verfügbaren Protokolle und Optionen flexibler einsetzbar. Zudem arbeitet Ping auf der Internet-Schicht, während cURL auf der Anwendungsschicht läuft. Das bedeutet, Ping testet, ob die Maschine am Netz ist. Der folgende cURL-Befehl hingegen überprüft, ob und wie ein Server reagiert:

# Testen, ob ein Web-Server erreichbar ist
server="google.com"
curl -I "$server"

Werden Ihnen nach Ausführung des Codes Statusinformationen angezeigt, ist der Server erreichbar.

Header ausgeben mit cURL

Bei jeder HTTP-Abfrage werden neben dem eigentlichen Dokument verschiedene Meta-Informationen ausgetauscht. Diese HTTP-Header genannten Informationen beschreiben sowohl das Dokument als auch den Status der HTTP-Abfrage. Sicherlich ist Ihnen schon einmal der Fehler 404 Not Found untergekommen. Dabei handelt es sich um genau so eine Meta-Information — das angeforderte Dokument wurde nicht gefunden.

Schauen Sie sich die Ausgabe der Header der URL 'google.com' an. Nutzen Sie dafür cURL mit der '--head' Option:

# Header ausgeben
url="google.com"
curl --head "$url"

Ihnen sollte unter anderem „301 Moved Permanently” angezeigt werden. Dabei handelt es sich um den HTTP-Status-Code für eine permanente Weiterleitung. Was Sie beobachten, ist die Weiterleitung von [google.com] (ohne 'www') auf [www.google.com].

Tipp

Statt der Option '--head' können Sie auch die äquivalente Schreibweise '-I' (großes i) verwenden. Merken Sie sich als Eselsbrücke, dass Sie damit Informationen für eine URL abrufen anstatt deren eigentlichen Content.

Redirect-Chains mit cURL analysieren

HTTP-Weiterleitungen (Englisch: „Redirects”) können in Reihe geschaltet sein. In diesem Zusammenhang wird der Begriff Redirect Chain (oder „Weiterleitungs-Kette”) verwendet. Stellen Sie sich als Beispiel eine Website vor, deren Homepage [https://www.example.com/] lautet. Wenn wir diese Site jedoch mit [http://example.com] ansprechen, ergeben sich gegebenenfalls die folgenden Weiterleitungen:

  • [http://example.com] → [https://example.com]
  • [https://example.com] → [https://www.example.com]
  • [https://www.example.com] → [https://www.example.com/]

Eine Verkettung der Weiterleitungen führt zu unnötig langen Ladezeiten und sollte vermieden werden. Leider handelt es sich um ein nicht einfach zu analysierendes Problem. Beim Laden der Site im Browser werden die Weiterleitungen nämlich durchlaufen, ohne dass der Benutzer davon viel mitbekommt. In diesem Fall hilft cURL mit der Option '--location' weiter. Diese leitet cURL an, den Weiterleitungen bis zur letzten zu folgen. Wir benutzen hier die Option '--head', weil uns der Inhalt der Seiten nicht interessiert.

# Redirects überprüfen
url="google.com"
curl --location --head  "$url"
Tipp

Statt der Option '--location' können Sie auch die äquivalente Schreibweise '-L' (großes l) verwenden.

Daten mit cURL an den Server übertragen

Sie können mit cURL nicht nur Daten abrufen, sondern auch Daten an einen Server senden. Das ist beispielsweise dann sehr praktisch, wenn Sie das Ausfüllen eines Online-Formulars automatisieren möchten. Neben der POST-Anfragemethode unterstützt cURL auch GET.

Da das Senden von Daten komplexer ist als das Abrufen, können wir hier nur ein ungefähres Beispiel skizzieren. Nutzen Sie für detailliertere Informationen die Hinweise von Everything curl.

# Daten an Server übertragen
url="example.com"
# Geben Sie die Daten als Schlüssel-Wert-Paare getrennt durch '&' an
daten="name=Peter&nachname=Mustermann&alter=42"
# Dieser curl-Aufruf übertragt die Daten per POST
curl --data "$daten" "$url"
# Alternativ weisen Sie curl an, die Daten per GET zu übertragen
curl --data "$daten" "$url" --get

Cookies mit cURL auslesen

HTTP-Cookies im Internet sind kleine Textinformationen, die beim Besuch der meisten Websites lokal auf Ihrem Gerät gespeichert werden. Sie können sich die Cookies einer besuchten Site im Browser ansehen und die Cookies dort auch löschen. Für Testzwecke ist dies jedoch meist zu umständlich. Mit cURL und der Option '--cookie-jar' („cookie jar”, zu Deutsch in etwa „Keksdose”) ist auch ein direkterer Zugriff auf die Cookies möglich.

# Cookies auslesen
url="www.google.com"
cookies="cookies.txt"
curl --head --cookie-jar "$cookies" "$url"
# Cookies mit dem cat-Befehl anzeigen
cat "$cookies"
Tipp

Mit Hilfe der Option '--cookie' können Sie cURL auch anweisen, Cookies zu versenden.

Generelle Optionen

Einige der verfügbaren cURL-Optionen lassen sich mit den bereits vorgestellten kombinieren.

Zusätzliche Informationen anzeigen

In manchen Fällen genügen die bei der Ausführung eines cURL-Befehls angezeigten Informationen nicht. Sie können dann die Option '--verbose' nutzen. Ein damit versehener cURL-Befehl gibt eine größere Fülle an Informationen aus.

# Zusätzliche Informationen anzeigen
url="www.google.com"
curl --verbose -I "$url"

Benutzer und Passwort mit cURL angeben

Manche URLs sind mit HTTP-Authentifizierung vor unerlaubtem Zugriff gesichert. Was jedoch, wenn Sie mit cURL auf eine derartige URL zugreifen möchten? Ohne Angabe von Nutzername und Passwort würde Ihnen der HTTP-Fehler 401 angezeigt. Nutzen Sie in diesem Fall das folgende Schema:

# Benutzer und Passwort mit curl angeben
# Passwortgeschützte URL 
url="www.example.com/secure/"
# Benutzer
nutzer=""
# Passwort
passwort=""
curl --user "${nutzer}:${passwort}" "$url"
Tipp

Sie können cURL auch nutzen, um Daten von einem FTP-Server abzurufen. Verwenden Sie dafür ebenfalls die Option --user, um Benutzername und Passwort anzugeben.

Proxy mit cURL verwenden

Ein Proxy ist ein zwischengeschalteter Server. Der Einsatz eines Proxys kann aus verschiedenen Gründen sinnvoll sein. Beispielsweise lassen sich bestimmte Sicherheits- und Performanz-Anforderungen durch Nutzung eines Proxys besser realisieren.

Wenn Sie sich über einen Proxy mit dem Internet verbinden, müssen Sie cURL darüber informieren. Nutzen Sie dafür die '--proxy' Option:

# Proxy mit cURL verwenden
url="www.google.com"
proxy="proxy.example.com"
port="8080"
curl --proxy "${proxy}:${port}" "$url"
Hinweis

Sofern Sie für den Proxy-Server Nutzername und Passwort angeben müssen, verwenden Sie zusätzlich die Option '--proxy-user'. Geben Sie in diesem Fall Nutzername und Passwort im Format 'nutzer:passwort' an.