Ein abgespeckter Docker-Container ohne curl und ohne wget, und trotzdem soll ein Health-Check eine HTTP-Anfrage absetzen. Der Entwickler Marek Šuppa hat dafür kein Werkzeug nachinstalliert, sondern die Bordmittel der Shell genutzt: Bash kann selbst eine TCP-Verbindung öffnen.

drweb.de als bevorzugte Quelle auf Google hinzufügenQualitätsgeprüfte Inhalte direkt in Google News & DiscoverJetzt hinzufügen

Der Kniff ist alt, aber gerade in schlanken Container-Umgebungen praktisch. Mit dem speziellen Pfad /dev/tcp spricht Bash HTTP von Hand, ganz ohne externes Programm.

Das Wichtigste in Kürze

  • Bash öffnet über den speziellen Pfad /dev/tcp/host/port direkt einen TCP-Socket, ohne dass curl oder wget installiert sein müssen.
  • Mit einem Dateideskriptor und einem handgeschriebenen HTTP-Request lässt sich so ein einfacher GET-Aufruf absetzen.
  • Der Trick eignet sich für Health-Checks in stark reduzierten Container-Images, in denen kein Netzwerk-Tool vorhanden ist.
  • Wichtige Grenze: /dev/tcp beherrscht kein TLS und gehört nicht in unbeaufsichtigten Produktivbetrieb.

Wie spricht Bash HTTP ganz ohne curl?

Ein rotes Schweizer Taschenmesser mit halb geöffneter Klinge liegt auf einer Holzoberfläche
Bash-Umleitung /dev/tcp/host/port ermöglicht Health-Check ohne zusätzlichen Container und hält das Image schlank

Der Ausgangspunkt war ein schlankes Image, das nur einen einzigen Health-Check-Prozess ausführen sollte. Ein zusätzliches curl in einem Sidecar-Container hätte die Sache unnötig aufgebläht. Šuppa wollte den Aufruf mit dem erledigen, was ohnehin da ist.

Bash behandelt bestimmte Dateinamen in Umleitungen speziell. Der Pfad /dev/tcp/host/port ist keine echte Datei, sondern eine eingebaute Funktion: Wenn der Host auflösbar und der Port gültig ist, öffnet die Shell den passenden TCP-Socket. Genau das macht den Aufruf ohne Zusatzprogramm möglich.

Wie sieht der konkrete Aufruf aus?

Der Ablauf braucht nur drei Bausteine. Zuerst öffnet ein Dateideskriptor die Verbindung mit exec 3<>/dev/tcp/service/8642. Danach schreibt ein printf den HTTP-Request samt Host-Header und Connection: close in diesen Deskriptor. Zuletzt liest cat <&3 die Antwort des Servers aus.

Der Hostname muss dabei auflösbar und erreichbar sein, etwa ein Service-Name in einem konfigurierten Docker-Netzwerk oder ein gültiger DNS-Eintrag. Für einen schlichten GET gegen einen internen Dienst reicht das vollständig, ohne dass eine einzige Zeile Software hinzukommt.

Manchmal ist die eleganteste Lösung die, die nichts hinzufügt. Wer ein 200-Megabyte-Tool installiert, um einen Health-Check zu fahren, hat die Frage falsch gestellt. Bordmittel zuerst, das spart Angriffsfläche und Wartung.

— Markus Seyfferth, Chefredakteur Dr. Web

Wo liegt die Grenze des Tricks?

Altes, rostiges Vorhängeschloss mit Kette und orangem Kabelbinder auf weißem Grund
/dev/tcp unterstützt kein TLS und HTTPS nicht direkt; für verschlüsselte Verbindungen bleibt openssl nötig. Trotzdem zuverlässig für Debugging und Tests

Der Komfort hat klare Grenzen. /dev/tcp kann kein TLS, eine HTTPS-Verbindung lässt sich damit nicht direkt aufbauen. Für verschlüsselte Aufrufe braucht es weiterhin ein Werkzeug wie openssl. Auch bei einer 301-Weiterleitung versagt der schlichte Ansatz.

Für Debugging, Testen und einfache interne Checks ist die Methode trotzdem ein verlässliches Bordmittel. Für unbeaufsichtigte Pipelines im Produktivbetrieb rät selbst die Entwickler-Community zur Vorsicht und greift dann wieder zu curl. Wer seine Entwicklungsumgebung sauber aufstellen will, findet Anregungen in unseren Tipps zu Windows 11 für Webentwickler und im Editoren-Vergleich 2026.

Mehr Newshunger?

Grüner Spielzeugvogel mit Lautsprecherschnabel, HTTP-Zettel und
Windows 11 Webentwickler-Tools: HTML-Editoren im Vergleich, KI-Code-Generierung und beste Ressourcen
4,3 23 Bewertungen

Wie hat Ihnen dieser Artikel gefallen?