Verbindungstests mit curl

2020-11-07 - christian - bash, http, network, projects

Das großartige Programm curl beherrscht neben HTTP auch viele andere Protokolle, darunter auch telnet. Damit ist curl eine super Alternative, sollte auf einem Computer mal kein telnet installiert sein.

HTTP Verbindungen testen

Das folgende Beispiel ruft einfach die angegebene URL auf und zeigt dessen Inhalt an:

curl -L -k https://example.com

Der Inhalt ist bei einem Verbindungstest meist aber nicht von Interesse. Mit dem Parameter -w (--write-out) kann curl verschiedene Zusatzinformationen ausgeben.

Das folgende Beispiel gibt Laufzeit, HTTP Status Code und Anzahl der getätigten Verbindungen aus.

Außerdem wird der Exit Code von curl angehängt. Verläuft der Verbindungsaufbau ohne Probleme, ist der Exit Code immer 0.

Der Inhalt der Website wird unterdrückt.

( curl --silent --max-time 5 -k -L --max-redirs 32 \
    -w "\n%{time_total}\t%{http_code}\t%{num_connects}\t" \
    https://example.com; echo $? ) | tail -n 1
0,182852    200    2    0

TCP Verbindungen testen

Generische TCP Verbindungen zu testen ist ein bisschen hacky. Es gibt keine verlässliche Möglichkeit nach dem Aufbau einer Verbindung diese sofort wieder zu schließen, auch sind die Exit Codes nicht wirklich aussagekräftig.

Abhilfe schafft das Aktivieren des Verbose Modes.

curl -v telnet://example.com:22
* Rebuilt URL to: telnet://localhost:22/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 22 (#0)

Findet sich in der Ausgabe die Zeile * Connected to ... war der Verbindungsaufbau erfolgreich. curl kann nun mit Ctrl+C beendet werden.

Folgendes Schnipsel macht dies automatisch mit Hilfe von timeout und gibt 0 (Erfolg) oder 1 (Fehler) aus.

echo "$(timeout 1 curl -v telnet://example.com:22 2>&1)" | \
    grep -F "* Connected to " > /dev/null; echo $?

Yet another project: Minimon

Minimon ist ein Bash Script welches all dies automatisiert, und das Monitoring via HTTP, TCP und ICMP (Ping) ermöglicht, ohne eine “echte” Monitoring Lösung installieren zu müssen. Perfekt für Wartungsarbeiten und Debugging.

Funktioniert mit git Bash (MINGW), WSL und natürlich auch Linux.

./minimon.sh --interval 60 \
    --http "https://example.com" \
    --http "https://google.com;google" \
    --icmp "8.8.8.8;google" \
    --tcp "8.8.8.8:53"
[2020-11-07T00:50:12+01:00] http - https://example.com - OK (0) - HTTP 200
[2020-11-07T00:50:13+01:00] http_google - https://google.com - OK (0) - HTTP 200
[2020-11-07T00:50:14+01:00] tcp - 8.8.8.8:53 - OK (0) - Connect successful
[2020-11-07T00:50:17+01:00] icmp_google - 8.8.8.8 - OK (0) - Ping succeeded (0% loss)

Den einzelnen Verbindungen können benannt werden, sobald sich der Status eines Tests verändert, gibt das Script eine neue Zeile aus und löst die ASCII Bell aus.


serverless.industries BG by Carl Lender (CC BY 2.0)
733b43b5 2020-11-07 00:58