Curl 없이 HTTP 요청 보내기
curl이나 wget이 없는 서버에서 작업해야 할 수도 있습니다. 엔드포인트를 테스트해야 하는데 해당 도구들이 없는 상황이죠. 이럴 때 Bash를 사용하여 직접 HTTP 요청을 보낼 수 있습니다.
Bash에는 /dev/tcp라는 숨겨진 기능이 있습니다. 이것은 실제 파일이 아니라 Bash가 이해하는 특수 장치입니다. /dev/tcp/hostname/port에 데이터를 쓰면, Bash가 사용자를 위해 TCP 연결을 열어줍니다.
작동 원리:
exec 명령어를 사용하여 파일 디스크립터(file descriptor)를 관리합니다. 예를 들어, 읽기 및 쓰기용으로 파일 디스크립터 3번을 열 수 있습니다.
구문은 다음과 같습니다:
exec 3<>/dev/tcp/example.com/80
연결이 열리면 데이터를 전송하거나 읽을 수 있습니다. 이 방법은 HTTP 프로토콜이 저수준(low level)에서 어떻게 작동하는지 보여줍니다.
GET 요청을 보내는 방법:
데이터를 가져오려면 올바른 헤더를 보내야 합니다. 요청의 끝을 알리기 위해 마지막에 빈 줄을 추가해야 합니다.
다음 단계를 따르세요:
- 호스트(host), 포트(port), 경로(path) 변수를 설정합니다.
exec를 사용하여 연결을 엽니다.printf를 사용하여 GET 요청을 보냅니다. 줄 바꿈에는\r\n을 사용합니다.cat이나 루프를 사용하여 응답을 읽습니다.- 작업이 끝나면 파일 디스크립터를 닫습니다.
예제 스크립트:
HOST="example.com"
PORT=80
REQUEST_PATH="/"
exec 3<>/dev/tcp/${HOST}/${PORT}
printf "GET ${REQUEST_PATH} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
cat <&3
exec 3>&-
이 기술은 클라이언트와 서버가 서로 어떻게 통신하는지 이해하는 데 도움이 됩니다. 최소한의 시스템(minimalist systems)에서 디버깅할 때 유용한 기술입니다.