CLI-Adventskalender, Tag 1: cURL

CLI-Adventskalender: cURL

Avatar von Eric

Den Start in unseren CLI-Adventskalender wagen wir mit cURL. Doch vorher sollten wir vielleicht erklären, was es mit diesem Adventskalender auf sich hat …

Willkommen zu unserem Mayflower-Kommandozeilen-Adventskalender! Vom ersten bis zum vierundzwanzigsten Dezember schneiden wir liebevoll die Spitzen von nützlichen Eisbergen und garnieren sie mit Schokolade. Unser Anspruch ist es, kleine, nützliche Informationsschnippsel für jeden Skill-Level und für viele Tätigkeitsbereiche zu präsentieren. Keine mühseligen Tutorials, nur minimale Kontextinformationen. Aber definitiv gute Ansatzpunkte, die Hunger auf mehr machen!

cURL

Als Webentwickler haben wir eine komplizierte Beziehung zu unseren Browsern. Sie machen viele Dinge möglich, aber auch viele Dinge schwer. Manchmal braucht man als Entwickler eine einfacheres Werkzeug, um schnell und wiederholt einfache Operationen auszuführen.

Für den Einstieg in unseren Adventskalender habe ich deswegen curl ausgewählt, ein kleines, unscheinbares Tool, dass auf den meisten Unix-oiden Betriebssystemen installiert ist.

curl https://arch.unixpeople.org/iso/latest/archlinux-x86_64.iso --output linux.iso

Unter seiner Haube versteckt sich aber noch viel mehr. cURL kann mehr als nur einfache Downloads. Es unterstützt tatsächlich eine Vielzahl von Protokollen. Zum Beispiel: Einfach mal eine Datei auf einen FTP-Server hochladen?

curl -u username:passwort -T datei.txt sftp://example.com/

Einen Videostream mitschneiden?

curl rtmp://example.com/sehenswerter/stream -o mitschnitt.flv

Eine Email verschicken?

curl --url 'smtps://smtp.example.com:465' --ssl-reqd \
  --mail-from 'eric@example.com' --mail-rcpt 'verteiler@example.com' \
  --upload-file wichtige_email.txt -u username:passwort

Den Mittelsmann rausschneiden

Mehr als die Hälfte des Internet-Traffics entsteht heutzutage durch APIs. Als Webentwickler ist die Fähigkeit einen API-Request bedarfsgerecht selbst zu gestalten ungeheuer nützlich. Statt hierbei auf komplexe (und evtl. auch teure) Werkzeuge zurückzugreifen reicht für einfache Anwendungsfälle auch das einfache Tool.

curl -X POST -H "Content-Type: application/json" -d @filename.json https://api.example.com/do_something

Daraus lassen sich natürlich prima Automatisierungen bauen; zum Beispiel Zeiten auf Jira-Tickets buchen (ein durchaus sehr relevanter Use Case für uns Dienstleister).

curl -u "email@example.com:api_token_here" \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{
    "timeSpent": "1h 30m",
    "comment": "Working on bug fixes."
  }' \
  "https://jira.example.com/rest/api/2/issue/TICKET-123/worklog"

Einfach in ein Datei pasten und als Skipt ausführen!

Da die meisten Webanwendungen und Softwarelösungen mit Internetfunktionalität mit APIs kommunizieren, kann man so auch mit einem scharfen Auge und etwas Geduld nervige Clients aus dem eigenen Leben ausklammern. Warum schließlich eine komplexe Anwendung starten und sich durch mehrere langsame Menüs klicken, wenn ein einfacher fire-and-forget-Konsolenbefehl ausreicht?

Zu diesem Thema…

Vereinfachung des täglichen Lebens

Es gibt mittlerweile unglaublich viele nützliche APIs und Services, die man gratis nutzen kann. cURL ist dabei der Schlüssel, sie zu nutzen – ohne einen klobigen Umweg über den Browser nehmen zu müssen. 

Was ist meine externe IP-Adresse?

curl https://ifconfig.me

Der aktuelle Dollar-Euro-Kurs?

curl -s "https://api.exchangerate-api.com/v4/latest/USD" | jq '.rates.EUR'

Oder das Wetter?

curl wttr.in/München

Den letzten Befehl bitte unbedingt mal ausprobieren. Es kommt sehr liebevoll gemachte ASCII-Kunst zurück.

Ein vielseitiges Werkzeug

Vor allem im DevOps-Bereich, in dem man „einfach mal schnell“ von einer Maschine in der man per SSH drin ist schauen kann, ob bestimmte Dinge gehen oder bestimmte Maschinen erreichbar sind, ist cURL unschlagbar.

cURL kann zum Beispiel testen, welchen Header ein Request zurückgibt.

curl -I https://example.com/interesting/page

Die Antwort gibt schnell Aufschluss darüber, ob eine bestimmte Seite erreichbar ist oder ob der Server Schwierigkeiten hat. cURL kann das auch gleich das ganze für eine Reihe verschiedener Server machen.

curl -I https://{blog,www,wiki}example.com/

… oder für ganze Reihen von Seiten:

curl -I https://blog.example.com/article/[1-100]

Natürlich lässt sich cURLs HTML-Output auch nach nützlichen Informationen durchsuchen. Zum Beispiel, wann ein Zertifikat abläuft:

curl -Iv https://blog.mayflower.de 2>&1 | grep "expire date"

cURL ist hier ein bißchen wie das Multitool in der Hosentasche: Es ist immer parat, um schnelle Antworten zu liefern und ohne viele Umwege bestimmte Aufgaben zu erledigen.

Ein letztes noch zum Abschied

Ich habe es thematisch nicht einsortiert bekommen, aber cURLs Fähigkeit, abgebrochene Downloads wiederaufzunehmen, finde ich ich auch sehr schön.

curl -C  - -O https://example.com/large.iso

Eine beschauliche Adventszeit; und schaut bitte auch morgen wieder rein für eure tägliche Kommandozeilen-Überraschung!

Shell-Weisheit des Tages
Die Automatisierung ist fest integriert: Schreibe einen beliebigen Befehl in eine Textdatei – und es ist ein Skript!

Ich nutze die Gelegenheit gleich mal, um unseren Code zu parametrisieren.

#!/bin/bash
email="email@example.com"
api_token="api_token_hier_rein"
time_spent="8h"
ticket="TICKET-123"
comment="Working on ticket."

if [ -n "$1" ] # -n ist true wenn der String dahinter eine Länge von größer als 0 hat
then
  time_spent=$1 # Wenn der erste Parameter gesetzt ist, nehmen wir den!
fi

if [ -n "$2" ]  # und so weiter für Parameter 2 und 3
then
  ticket=$2
fi

if [ -n "$3" ]
then
  comment=$3
fi

curl -u "$email:$api_token" \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{
    "timeSpent": '$time_spent'
    "comment": '$comment'
  }' \
  "https://jira.example.com/rest/api/2/issue/$ticket/worklog"

Speichern können wir das zum Beispiel als zeit_buchen.sh. Und nicht vergessen, die Ausführberechtigung zu setzen!

chmod +x zeit_buchen.sh
./zeit_buchen.sh 8h TICKET-123

Dieser Ansatz funktioniert mit jeder beliebigen Kombination von Befehlen. Häufig zusammen ausgeführte Befehle können so geclustert und mit dem Rest des Teams geteilt werden. Mit anderen Worten …

Jeder Befehl, den Du in die Kommandozeile schreibst, ist eine potenzielle Automatisierung, die sich beliebig weit hochskalieren lässt.

Avatar von Eric

Kommentare

Schreibe einen Kommentar

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


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.