Żądania HTTP bez curl: Wyjaśnienie Bash /dev/tcp
Znajdujesz się w okrojonym kontenerze Docker. Musisz sprawdzić punkt końcowy API. Wpisujesz curl i otrzymujesz „command not found”. Próbujesz wget i otrzymujesz ten sam błąd.
Nie musisz panikować. Bash posiada ukrytą funkcję wbudowaną w jego rdzeń. Nazywa się ona /dev/tcp.
Ta funkcja pozwala na otwieranie surowych połączeń TCP bez instalowania jakichkolwiek narzędzi. Działa na prawie każdym systemie Linux.
Jak to działa: Gdy odwołujesz się do /dev/tcp/hostname/port, Bash otwiera połączenie gniazdowe. Jest to funkcja specyficzna dla Basha. Nie będzie działać w sh ani zsh.
Magiczna komenda: exec 3<>/dev/tcp/hostname/port
Ta linia otwiera dwukierunkowy deskryptor pliku. Możesz do niego zapisywać dane i odczytywać odpowiedzi.
Przykład żądania 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>&-
Dlaczego to jest przydatne: • Debugowanie w minimalnych środowiskach, w których nie można instalować pakietów. • Uruchamianie kontroli stanu (health checks) w potokach CI/CD bez żadnych zależności. • Testowanie łączności w systemach wbudowanych. • Nauka tego, jak dokładnie działają nagłówki HTTP.
Ważne ograniczenia, o których należy pamiętać: • Brak HTTPS: Bash nie obsługuje szyfrowania TLS/SSL. Do ruchu szyfrowanego użyj openssl s_client. • Brak przekierowań: Musisz obsługiwać je ręcznie. • Brak złożoności: Nie używaj tego do tworzenia produkcyjnych klientów HTTP. Do tego celu użyj curl.
Zawsze dołączaj nagłówek Connection: close. Jeśli o nim zapomnisz, Twój skrypt może zawisnąć, czekając na serwer.
Następnym razem, gdy utkniesz na zablokowanym serwerze, użyj tego triku. Zmienia on ślepą uliczkę w działające narzędzie.
Źródło: https://dev.to/onsen/http-requests-without-curl-bash-devtcp-explained-5852
Opcjonalna społeczność edukacyjna: https://t.me/GyaanSetuAi