𝗛𝗧𝗧𝗣 𝗥𝗲𝗾𝘂𝗲𝘀𝘁𝘀 𝗪𝗶𝘁𝗵𝗼𝘂𝘁 𝗰𝘂𝗿𝗹: 𝗕𝗮𝘀𝗵 /𝗱𝗲𝘃/𝗧𝗖𝗣 𝗘𝘅𝗽𝗹𝗮𝗶𝗻𝗲𝗱

최소한의 기능만 남은 Docker 컨테이너 안에 있습니다. API 엔드포인트를 확인해야 합니다. curl을 입력했지만 "command not found"라는 메시지가 뜹니다. wget을 시도해 봐도 똑같은 에러가 발생합니다.

당황할 필요 없습니다. Bash의 핵심에는 숨겨진 기능이 내장되어 있습니다. 그것은 바로 /dev/tcp입니다.

이 기능을 사용하면 별도의 도구를 설치하지 않고도 로우(raw) TCP 연결을 열 수 있습니다. 거의 모든 Linux 시스템에서 작동합니다.

작동 원리: /dev/tcp/hostname/port를 참조하면, Bash가 소켓 연결을 엽니다. 이것은 Bash 전용 기능입니다. shzsh에서는 작동하지 않습니다.

마법의 명령어: exec 3<>/dev/tcp/hostname/port

이 라인은 양방향 파일 디스크립터(file descriptor)를 엽니다. 데이터를 쓰고 응답을 다시 읽어올 수 있습니다.

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>&-

유용한 이유: • 패키지를 설치할 수 없는 최소 환경에서의 디버깅. • 의존성 없이 CI/CD 파이프라인에서 헬스 체크(health check) 실행. • 임베디드 시스템에서의 연결성 테스트. • HTTP 헤더가 정확히 어떻게 작동하는지 학습.

기억해야 할 중요한 제한 사항: • HTTPS 불가: Bash는 TLS/SSL 암호화를 처리할 수 없습니다. 암호화된 트래픽에는 openssl s_client를 사용하세요. • 리다이렉트 불가: 수동으로 처리해야 합니다. • 복잡성 제한: 프로덕션용 HTTP 클라이언트로 사용하지 마세요. 그 용도로는 curl을 사용해야 합니다.

항상 Connection: close 헤더를 포함하세요. 이를 잊으면 스크립트가 서버의 응답을 기다리며 멈춰버릴(hang) 수 있습니다.

다음에 보안이 엄격한 서버에 갇히게 된다면, 이 트릭을 사용해 보세요. 막다른 길을 유용한 도구로 바꿔줄 것입니다.

Source: https://dev.to/onsen/http-requests-without-curl-bash-devtcp-explained-5852

Optional learning community: https://t.me/GyaanSetuAi