Żą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