기존 TCP 연결을 사용하여 bash 스크립트에서 http 서버에 액세스하는 방법은 무엇입니까?

기존 TCP 연결을 사용하여 bash 스크립트에서 http 서버에 액세스하는 방법은 무엇입니까?

Bash 쉘 scipt에서는 여러 명령줄 도구( wget, curl, , httpie)를 사용하여 http 서버를 테스트합니다.

예를 들어 컬을 사용하여 GET 요청을 호출할 때 http 통신이 완료되자마자 내 서버에 대한 TCP 연결이 열리고 닫히는 것을 볼 수 있습니다.

$ curl http://10.5.1.1/favicon.ico -o /dev/null 

서버의 연결 유지 동작을 더 잘 테스트하기 위해 여러 http 요청/응답 주기에 걸쳐 TCP 연결을 열어두고 싶습니다.

다음과 같이 bash에서 직접 잘못된 http 요청을 수행할 수 있습니다.

exec 3<>/dev/tcp/10.5.1.1/80
printf "GET /\r\n\r\n" >&3
while IFS= read -r -u3 -t2 line || [[ -n "$line" ]]; do echo "$line"; done
exec 3>&-
exec 3<&-

그러나 내 테스트 통신은 (인증 등을 포함하여) 훨씬 더 복잡하기 때문에 bash나 다른 스크립팅 언어로 직접 코딩하기보다는 기존 도구를 사용하고 싶습니다. 이제 아이디어는 먼저 bash에서 tcp 소켓을 연 다음 일부 명령줄 도구가 자체 소켓을 여는 대신 이 연결을 사용하도록 하는 것입니다. 어쩌면 이런 것일 수도 있습니다.

exec 3<>/dev/tcp/10.5.1.1/80
curl http://10.5.1.1/message.txt --use-existing-socket-fd=3
# ... do some other testing stuff ...
wget http://10.5.1.1/message.txt --use-existing-socket-fd=3
# ... do some other testing stuff ...
http http://10.5.1.1/message.txt --use-existing-socket-fd=3
exec 3>&-
exec 3<&-

위의 도구나 다른 도구를 사용하여 이것이 가능합니까?

답변1

당신이 찾고 있는 도구는 입니다 socat. 웹 서버를 테스트하고 있으므로 해당 서버에 대한 영구 연결을 설정하도록 요청할 수 있습니다(웹 서버를 닫도록 선택하지 않는 한 그에 따라 시간 제한을 조정하십시오). 완료되면 연결을 터널로 사용할 수 있습니다. 이를 수행하는 두 가지 방법이 있습니다.

Unix 소켓을 통한 쿼리

curl--unix-socketUnix 소켓을 통해 HTTP 요청을 보내고 HTTP 응답을 받을 수 있는 옵션이 있습니다 . (귀하의 의견에 감사드립니다.)

다음과 같이 사용할 수 있습니다.

socat TCP:10.5.1.1:80 UNIX-LISTEN:/tmp/curl.sock,fork

그런 다음 다른 터미널에서 다음을 수행합니다.

curl --unix-socket /tmp/curl.sock http://10.5.1.1/message1.txt
curl --unix-socket /tmp/curl.sock http://10.5.1.1/message2.txt
...

의사 HTTP 프록시를 통한 쿼리

또한 터널을 의사 프록시로 사용하여 , ,...을(를) 연결할 수도 wget있습니다 curl. 이 솔루션의 장점은 이에 국한되지 않습니다 curl.

이번에는 socat로컬 TCP 포트(예: 3128)에서 수신 대기합니다.

socat TCP:10.5.1.1:80 TCP-LISTEN:3128,fork,reuseaddr

그런 다음 다른 터미널에서 다음을 수행합니다.

export http_proxy='http://localhost:3128'
curl http://10.5.1.1/message.txt
wget http://10.5.1.1/message.txt
....

HTTP 클라이언트는 프록시를 사용하므로 HTTP 요청이 약간 변경되어 바람직하지 않을 수 있습니다.

물론 두 솔루션 모두 여러 HTTP 서버에서 작동하지 않습니다. 이는 모든 요청을 수신하는 채널 끝에 있는 웹 서버이기 때문입니다.

답변2

테스트 시나리오에서 cURL을 명령줄 도구로만 사용하는 경우 해당 --next옵션을 사용하여 활성화 할 수 있습니다.지속적인 연결. 예를 들어,

curl -v http://google.com --next http://google.com |& grep -i connect

출력에서 알 수 있듯이 열린 연결을 재사용하고 있습니다.

* Connected to google.com (142.250.179.206) port 80
* Connection #0 to host google.com left intact
* Re-using existing connection with host google.com
* Connection #0 to host google.com left intact

관련 정보