Bash를 사용한 TCP 연결

Bash를 사용한 TCP 연결

Bash를 사용하여 TCP 연결을 리디렉션하기 위해 다음 명령이 아무것도 반환하지 않는 이유는 무엇입니까?

[root@rocks7 ~]# echo -e "GET / HTTP/1.1\n\n" > /dev/tcp/yahoo.com/80
[root@rocks7 ~]# printf "GET / HTTP/1.1\n\n" > /dev/tcp/google.com/80
[root@rocks7 ~]# 

답변1

개방형 읽기 및 쓰기 연결을 사용 <>하고 더 많은 헤더를 보낸 다음 응답을 읽어야 합니다. 예를 들어,

exec 5<>/dev/tcp/yahoo.com/80
echo -e "GET / HTTP/1.1\r\nHost: yahoo.com\r\nContent-Length: 0\r\n\r" >&5
# get reply:   HTTP/1.1 301 Moved Permanently^M
cat <&5

표준 0, 1, 2를 위반하는 것을 피하기 위해 임의의 파일 설명자 5를 사용하고 있습니다. Yahoo에서는 콘텐츠 길이 헤더가 필요하지 않지만 다른 사이트에서는 추가 입력을 받을 때까지 응답하지 않을 수 있습니다. Yahoo에서는 호스트 헤더가 필요하지 않으면 응답을 받게 됩니다 HTTP/1.1 400 Host Header Required.

답변2

meuth의 답변에 추가되었습니다.https://unix.stackexchange.com/a/440053/380936

원격 서버와의 통신이 완료되면 소켓을 닫는 것을 잊지 마세요.

exec 5>&-

예를 들어 다음을 추가할 수도 있습니다 Connection: close.

echo -e "GET / HTTP/1.1\r\nHost: yahoo.com\r\nContent-Length: 0\r\nConnection: close\r\n\r" >&5

관련 정보