cURL mit 6 praktischen Beispielen erklärt

cURL ist ein Open Source Kommandozeilentool, mit dem sich aus Shell- oder Batchskripten heraus Dateien über Protokolle wie http, https, ftp, gopher, sftp, ftps oder scp übertragen lassen. cURL leistet mir gute Dienste bei der Entwicklung von Websites. Mit cURL lassen sich Websites fernsteuern und testen. Anhand einiger Beispiele möchte ich den großen Vorteil von cURL demonstrieren.

1. Websites auslesen

curl http://example.com/index.html
Mit diesem Kommando wird die Datei index.html ausgelesen und auf der Standardausgabe ausgegeben.
Möchten wir die Datei unter dem Namen savedpage.html abspeichern, benutzen wir dazu folgenden Befehl:

curl -o savedpage.html http://www.example.com/

Erfordert eine Website die Anmeldung über den HTTP-Authentifizierungsmechanismus, lassen sich über cURL auch Benutzername und Passwort übergeben.

curl -u username:password http://www.example.com/

Wenn sich eine URL geändert hat, machen viele Webmaster von der Möglichkeit gebrauch auf die neue Adresse umzuleiten. Da in der Standardkonfiguration cURL Weiterleitungen nicht folgt, müssen wir in diesem Fall den Parameter -L übergeben.

curl -L http://www.example.com/

2. URL mit variablen GET-Parameter auslesen

cURL ermöglicht die Übergabe eines regulären Ausdrucks als GET-Parameter. Nehmen wir an ein Website wäre über ein CMS betrieben und böte die einzelnen Dokumente über URLs nach folgenden Schema an.

http://example.com/pages.php?id=1
http://example.com/pages.php?id=17
http://example.com/pages.php?id=99

An cURL lässt sich der Parameter id als regulärer Ausdruck übergeben, um alle ids und damit Dokumente in einen bestimmten Bereich zu erfassen.

curl -o pages#1.html http://example.com/pages.php?id=[1-99]

Damit weisen wir cURL an alle Dokumente mit den ids 1-99 aufzurufen und in den Dateien page01.html bis page99.html in das Verzeichnis aus dem cURL aufgerufen wurde zu schreiben. Doch was passiert, wenn zum Beispiel die Datei http://example.com/pages.php?id=42 nicht existieren sollte? Hier hebt cURL sich in der Standardkonfiguration durch ein besonders intelligentes Verhalten hervor: Liefert die aufgerufene URL den Fehler 404 – Dokument nicht gefunden – zurück, fährt cURL mit der nächsten id fort, ohne dabei die Datei page42.html anzulegen.

3. HTTP-Header auslesen

curl --head http://www.google.com/
Mit dem Parameter –head weisen wir cURL an den HTTP-Header auf die Standardausgabe zu schreiben.
Möchten wir den Header in die Datei header.txt schreiben, ließe sich das zum einen durch Umleitungsoperatoren der Shell erreichen oder ganz ohne Unterstützung der Shell durch den Parameter –dump-header.

curl --dump-header headers.txt http://www.google.com/

4. cURL und FTP

Neben vielen weiteren Protokollen kann cURL auch mit FTP-Servern sprechen.

curl ftp://username:password@example.com

Damit weisen wir cURL an den Index des Hauptverzeichnisses auszugeben. Benutzername und Passwort werden direkt in der URL kodiert.
Möchten wir das Unterverzeichnis images auf dem FTP-Server auflisten, genügt es das Verzeichnis an die URL zu hängen:

curl ftp://username:password@example.com/images/

Mit cURL ist auch ein Upload auf einen FTP-Server möglich, dazu übergeben wir den Parameter -T gefolgt vom Dateinamen bzw. vollständigen Dateipfad.

curl -T uploadfile.txt -u username:password ftp://example.com/files/myfile.txt
Mit diesem Kommando kopiert cURL die Datei uploadfile.txt auf den FTP-Server in das Verzeichnis files unter den Dateinamen myfile.txt.

5. Formulare mit cURL ausfüllen

Nehmen wir an ein Formular auf einer Website hätte folgenden Aufbau:




Der Parameter -d weist cURL an die Daten als application/x-www-form-urlencoded formatierte Zeichenkette an den Server zu übergeben.

curl -d "item=Book&category=SiFi&submit=speichern" http://www.example.com/add.php

Die einzelnen Input-Felder des Formulars werden in der URL mit dem Namen angesprochen, ihr Wert wird über den Operator = zugewiesen. Die Verknüpfung der einzelnen Felder erfolgt mit dem &-Operator. Wir befüllen im Beispiel das Formularfeld item also mit „Book“ und das Feld category mit „SiFi“.

6. Referer & User Agent

HTTP-Request können das Attribut referer tragen, das dem Webserver Aufschluss darüber gibt, über welche URL die aktuelle Ressource aufgerufen wurde. Mit cURL lässt sich das referer-Attribut nach belieben setzen, indem wir den Parameter -e gefolgt von der augenscheinlich verweisenden URL setzen.

curl -e http://refferingsite.com http://www.example.com/

Alle HTTP-Anfragen sollten das Attribut User-Agent aufweisen, das dem Server mitteilt über welchen Client der Zugriff erfolgt. Das Attribut User-Agent ermöglicht es zum Beispiel eine spezielle Version einer Website für das iPhone oder andere Geräte auszuliefern.

Um einen bestimmten User-Agent zu simulieren, können wir den Parameter -A gefolgt vom angeblichen User-Agent setzen. Um uns zum Beispiel als iPhone auszugeben, benutzen wir folgenden Befehl:

curl -A "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3" http://www.example.com

Bei entsprechenden Feedback zum Artikel, werde ich gerne weitere Anwendungen für cURL aufzeigen.

12 Antworten auf „cURL mit 6 praktischen Beispielen erklärt“

  1. Hallo Thomas,

    durch ewiges googlen nach einen Fehler habe ich deine Seite gefunden. Leider steht hier garnichts von dem was ich gesucht habe :))

    Aber egal, so wie es scheint hast du Ahnung von dem Thema und kannst mir evtl. helfen.

    Ich lade schon ewig trailer auf uploaded.to und verteile sie dann. Jetzt haben die Ihr System umgestellt und der upload geht nicht mehr. Login funktioniert schon wieder.

    Wenn ich in der console folgendes eingebe:
    curl –connect-timeout 20 -m 600 -b cookie-uploaded.txt -c cookie-uploaded.txt –connect-timeout 20 -F file1x=@OUTBOX/traier/trailer428.rar http://stor1038.uploaded.to/up?output=xml&upload_id=66789 -v

    bekomme ich zurück:

    413 Request Entity Too Large

    413 Request Entity Too Large
    nginx/0.8.54

    betty@worker:~$

    Hast du eine Idee was ich falsch mache?

    Ich weiß auch nicht wie ich mir von dem ein.- ausgang ein log anlegen kann.. hatte es schon mit –stderr info.txt versucht, aber da steht dann nur quatsch drin.

    Würde mich sehr freuen wenn du mir helfen kannst!

    Gruß
    WillyWacker

  2. Hi Thomas,

    dein Artikel find ich sehr gelungen und sehr hilfreich! Wenn ich allerdings versuche, mich auf einen externen FTP-Server zu connecten:

    curl ftp://username:password@example.com/images/

    kriege ich folgende Meldung:

    curl: (67) Access denied: 530

    obwohl Passwort, Server und User richtig sind.

    An die vsftpd.conf oder proftpd.conf auf dem remote FTP-Server komme ich leider nicht ran! Dort habe ich lediglich nur einen FTP-Zugriff, um Dateien per curl eben 🙂 – hinsichtlich eines Backups – hochzuladen!

    Grüße
    Filip

  3. Hallo,

    ich suche eine Möglichkeit wget durch curl zu ersetzen.
    Ich habe ein Repository in github und würde gerne mittels curl eine Datei herunter laden.
    Das ganze unter OpenWRT in der Luci-Oberfläche beim SoftwareUpdate (:
    Mir wäre also ein Link oder ein Script interessant, der wget simuliert.
    Aber vielleicht hast du trotzdem einen Tip?

    Vielen Dank

  4. Danke! Hat mir sehr geholfen. Mir hat der Befehl -u zum übermitteln der Anmeldedaten gefehlt… Jetzt kann ich meine Webcam über die Homematic CCU2 zu einer Aufnahme bewegen, die über einen externen Bewegungssensor gesteuert wird. 🙂

  5. Pingback: pantox.de
  6. Hallo Thomas,
    vllt. kannst du mir helfen,
    ich möchte eine Datei auf einem entfernten Server auslesen und nach einem bestimmten Inhalt suchen, dann soll die gesamte Zeile ausgegeben werden.
    Link zur Datei: http://andres-webdesign.de/js/eSMOMEvents.js
    Suchtext: var SMBrokerURL
    Ergebnis: var SMBrokerURL = „https://www.smartstore.com/services/sm6/smbiz_smartbroker.php5“

    Besten Dank im voraus
    Gruss André

  7. Hallo 🙂

    Ein paar weitere Parameter wären nicht schlecht.
    Ich versuche schon eine ganze weile einen Teil einer Webseite zu kopieren um sie auch *offline* nutzen zu können. (http://opposedforces.com/parts/forester/)
    Also alles drin. Mit Bilder usw.

    Mit wget will nichts runter. Httrack bricht auch ab. Komme da nicht weiter.
    Nutze Mac OSX und da wäre curl ja eh dabei und würde sich anbieten. Nur irgendwie scheint das auch nicht zu gehen?
    Liegt das an der Webseite selber?

    Beste Grüße aus Franken
    Tom

  8. Hallo, ich bin keine Leuchte was das scripten angeht. Deine Seite hat mir geholfen CURL zu verstehen. In meiner alten Firma haben Kollegen damit ein Verfahren entwickelt zum Beispiel eine Dell Seite nach einer bestimmten Info abzufragen. Nun bekomme ich das leider nicht hin. Vielleicht kannst Du mir ein paar Fragen beantworten. Ich möchte gern die Seite http://www.dell.com/support/home/de/de/dedhs1/Configuration/ServiceTag/8YQ9PK1 abfragen und die Info hinsichtlich des mitgelieferten Betriebssystems herausziehen, um es später in einer Exceltabelle zu verarbeiten. Kannst Du helfen?

  9. Welchen Befehl kann ich eingeben, wenn ich auch die verlinkten Bilder und anderen Dokumente laden will via cURL?

  10. Hallo Wilhelm,

    am einfachsten gelingt dies über wget:

    wget -nd -r -P ~/download -A jpg,gif,png http://www.mydomain.com

    Die Parameter bedeuten:

    -nd Die Verzeichnisstruktur wird nicht nachgebildet, d.h. alle Dateien werden in das Verzeichnis ~/download gesichert.

    -r Dateien werden rekursiv geladen, d.h. es wird allen Links innerhalb der Website gefolgt.

    -P Angabe des Downloaverzeichnisses

    -A Liste der zu ladenden Dateiendungen

    Ich hoffe, ich konnte dir helfen.

    Gruß
    Tom

  11. Hallo Thomas,

    so wie es aussieht hast Du Ahnung von der Materie. Vielleicht hast Du eine Lösung für mich.
    Ich möchte in einem Script eine Datei auf einem FTP-Server verschieben ohne in meinem Output immer den Inhalt des Servers mit zu loggen.

    Beispiel: curl -sS "$LST_SRC/" -Q "-RNFR ${SFILE}" -Q "-RNTO ${ARCDIR}/${SFILE}"

    Mein Output wird durch diese „unerwünschten Einträgen“ unschön:


    07-22-17 01:55AM arc
    06-02-17 01:45PM cfgImport
    07-24-17 02:30AM 409353 File01.zip
    07-24-17 02:32AM 840434 File02.zip
    07-21-17 04:54PM 3480672 File03.csv
    11-23-16 02:11PM Test
    07-23-17 05:17PM 1893985991 File04.txt
    2017-07-24 01:55:02 INFO Verschieben der Datei File01.zip nach /XYZ/arc/20170724_015502/ erfolgreich.
    07-24-17 01:55AM arc
    06-02-17 01:45PM cfgImport
    07-24-17 02:32AM 840434 File02.zip
    07-21-17 04:54PM 3480672 File03.csv
    11-23-16 02:11PM Test
    07-23-17 05:17PM 1893985991 File04.txt
    2017-07-24 01:55:02 INFO Verschieben der Datei File02.zip nach /XYZ/arc/20170724_015502/ erfolgreich.
    07-24-17 01:55AM arc
    06-02-17 01:45PM cfgImport
    07-21-17 04:54PM 3480672 File03.csv
    11-23-16 02:11PM Test
    07-23-17 05:17PM 1893985991 File04.txt
    2017-07-24 01:55:03 INFO Verschieben der Datei File03.csv nach /XYZ/arc/20170724_015502/ erfolgreich.
    07-24-17 01:55AM arc
    06-02-17 01:45PM cfgImport
    11-23-16 02:11PM Test
    07-23-17 05:17PM 1893985991 File04.txt
    2017-07-24 01:55:58 INFO Verschieben der Datei File04.txt nach /XYZ/arc/20170724_015502/ erfolgreich.

    Hast Du eine Idee?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.