Requêtes HTTP sans curl : Bash /dev/tcp expliqué
Vous êtes à l'intérieur d'un conteneur Docker allégé. Vous devez vérifier un point de terminaison d'API. Vous tapez curl et obtenez "command not found". Vous essayez wget et obtenez la même erreur.
Pas de panique. Bash possède une fonctionnalité cachée intégrée à son cœur. Elle s'appelle /dev/tcp.
Cette fonctionnalité vous permet d'ouvrir des connexions TCP brutes sans installer d'outils. Elle fonctionne sur presque tous les systèmes Linux.
Comment ça marche : Lorsque vous faites référence à /dev/tcp/hostname/port, Bash ouvre une connexion socket. C'est une fonctionnalité spécifique à Bash. Cela ne fonctionnera pas dans sh ou zsh.
La commande magique : exec 3<>/dev/tcp/hostname/port
Cette ligne ouvre un descripteur de fichier bidirectionnel. Vous pouvez y écrire des données et lire les réponses en retour.
Exemple de requête GET : #!/bin/bash exec 3<>/dev/tcp/example.com/80 printf "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n" >&3 cat <&3 exec 3>&-
Pourquoi c'est utile : • Débogage dans des environnements minimalistes où vous ne pouvez pas installer de paquets. • Exécution de tests de santé (health checks) dans des pipelines CI/CD sans aucune dépendance. • Test de connectivité sur des systèmes embarqués. • Apprendre exactement comment fonctionnent les en-têtes HTTP.
Limites importantes à retenir : • Pas de HTTPS : Bash ne peut pas gérer le chiffrement TLS/SSL. Utilisez openssl s_client pour le trafic chiffré. • Pas de redirections : Vous devez les gérer manuellement. • Pas de complexité : N'utilisez pas cela pour des clients HTTP de production. Utilisez curl pour cela.
Incluez toujours l'en-tête Connection: close. Si vous l'oubliez, votre script pourrait rester bloqué en attendant le serveur.
La prochaine fois que vous serez bloqué sur un serveur restreint, utilisez cette astuce. Elle transforme une impasse en un outil fonctionnel.
Source: https://dev.to/onsen/http-requests-without-curl-bash-devtcp-explained-5852
Communauté d'apprentissage optionnelle: https://t.me/GyaanSetuAi