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
curl ausgewählt, ein kleines, unscheinbares Tool, dass auf den meisten Unix-oiden Betriebssystemen installiert ist.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl https://arch.unixpeople.org/iso/latest/archlinux-x86_64.iso --output linux.iso
curl https://arch.unixpeople.org/iso/latest/archlinux-x86_64.iso --output linux.iso
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?

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -u username:passwort -T datei.txt sftp://example.com/
curl -u username:passwort -T datei.txt sftp://example.com/
curl -u username:passwort -T datei.txt sftp://example.com/

Einen Videostream mitschneiden?

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl rtmp://example.com/sehenswerter/stream -o mitschnitt.flv
curl rtmp://example.com/sehenswerter/stream -o mitschnitt.flv
curl rtmp://example.com/sehenswerter/stream -o mitschnitt.flv

Eine Email verschicken?

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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
Goodies von Mayflower

Keine Sorge – Hilfe ist nah! Melde Dich unverbindlich bei uns und wir schauen uns gemeinsam an, ob und wie wir Dich unterstützen können.

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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -X POST -H "Content-Type: application/json" -d @filename.json https://api.example.com/do_something
curl -X POST -H "Content-Type: application/json" -d @filename.json https://api.example.com/do_something
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).

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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"
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"
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?

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl https://ifconfig.me
curl https://ifconfig.me
curl https://ifconfig.me

Der aktuelle Dollar-Euro-Kurs?

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -s "https://api.exchangerate-api.com/v4/latest/USD" | jq '.rates.EUR'
curl -s "https://api.exchangerate-api.com/v4/latest/USD" | jq '.rates.EUR'
curl -s "https://api.exchangerate-api.com/v4/latest/USD" | jq '.rates.EUR'

Oder das Wetter?

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl wttr.in/München
curl wttr.in/München
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -I https://example.com/interesting/page
curl -I https://example.com/interesting/page
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -I https://{blog,www,wiki}example.com/
curl -I https://{blog,www,wiki}example.com/
curl -I https://{blog,www,wiki}example.com/

… oder für ganze Reihen von Seiten:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -I https://blog.example.com/article/[1-100]
curl -I https://blog.example.com/article/[1-100]
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -Iv https://blog.mayflower.de 2>&1 | grep "expire date"
curl -Iv https://blog.mayflower.de 2>&1 | grep "expire date"
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -C - -O https://example.com/large.iso
curl -C - -O https://example.com/large.iso
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#!/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"
#!/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"
#!/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!

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
chmod +x zeit_buchen.sh
./zeit_buchen.sh 8h TICKET-123
chmod +x zeit_buchen.sh ./zeit_buchen.sh 8h TICKET-123
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.

Goodies von Mayflower

Keine Sorge – Hilfe ist nah! Melde Dich unverbindlich bei uns und wir schauen uns gemeinsam an, ob und wie wir Dich unterstützen können.

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.