Bash 셸에 내장된 특별한 기능인 /dev/tcp를 사용하면 curl이나 wget과 같은 외부 도구 없이도 HTTP 요청을 직접 보낼 수 있습니다. 이는 특히 용량을 극도로 줄인 컨테이너 이미지처럼 외부 패키지 설치가 어려운 환경에서, 다른 서비스와의 네트워크 연결 상태를 확인하거나 간단한 API 호출을 테스트할 때 매우 유용합니다.
이 기능은 실제 파일 시스템에 존재하는 /dev/tcp 디렉토리가 아니라, Bash 셸이 내부적으로 TCP 소켓 통신을 처리하기 위해 제공하는 가상 경로입니다. `exec 3<>/dev/tcp/호스트/포트` 명령을 통해 특정 호스트와 포트로 TCP 연결을 열고, 이 연결에 파일 디스크립터(예: 3)를 할당합니다. 이후 `printf` 명령으로 HTTP 요청 헤더와 본문을 직접 작성하여 이 파일 디스크립터로 전송하고, `cat <&3` 명령으로 서버의 응답을 읽어올 수 있습니다. 예를 들어, `GET /health HTTP/1.1\r\nHost: service\r\nConnection: close\r\n\r\n`와 같은 형태로 요청을 구성하여 보낼 수 있습니다. 이때 `Connection: close` 헤더를 포함하는 것이 중요한데, 이를 통해 서버가 응답 후 연결을 닫아 `cat` 명령이 응답을 모두 읽고 종료될 수 있도록 합니다.
물론 /dev/tcp를 통한 HTTP 요청은 진정한 HTTP 클라이언트가 아니므로, 리디렉션, 압축, TLS(HTTPS) 처리, 청크(chunked) 응답 파싱 등 curl이 제공하는 다양한 고급 기능은 지원하지 않습니다. 이는 어디까지나 빠르고 기본적인 연결 테스트 및 디버깅을 위한 용도입니다. 또한, 이 기능은 Bash 고유의 기능으로, dash나 zsh 같은 다른 셸에서는 작동하지 않을 수 있으며, Bash가 `--enable-net-redirections` 옵션으로 컴파일되어야만 사용할 수 있습니다. 하지만 대부분의 최신 리눅스 배포판에서는 이 옵션이 기본으로 활성화되어 있어 별다른 문제 없이 활용 가능합니다.
이러한 Bash의 숨겨진 기능은 개발 및 운영 환경에서 예상치 못한 상황에 직면했을 때 문제를 해결하는 데 중요한 역할을 할 수 있습니다. 특히 마이크로서비스 아키텍처나 서버리스 환경에서 경량 컨테이너를 사용할 때, 불필요한 의존성을 줄이면서도 필수적인 네트워크 진단을 수행할 수 있는 강력한 대안이 됩니다. 복잡한 도구 없이도 시스템의 핵심 기능을 활용하여 문제를 해결하는 능력은 개발자에게 큰 자산이 될 것입니다.
