프록시를 사용하여 쉘 스크립트에서 텔넷을 통해 HTTP 헤더 응답 받기

프록시를 사용하여 쉘 스크립트에서 텔넷을 통해 HTTP 헤더 응답 받기

비지박스 환경에 컬이나 wget이 없기 때문에 서버(google)로부터 http 헤더 응답을 얻으려면 텔넷을 사용해야 합니다. 또한 저는 프록시 뒤에 있습니다. 따라서 명령줄에서 다음을 성공적으로 수행할 수 있습니다.

$  telnet proxy.ip port
HEAD http://www.google.com/ HTTP/1.1
{hit enter twice}

HTTP/1.1 200 OK
Date: Tue, 15 Jan 2019 09:11:28 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
entire header follows...

하지만 쉘 스크립트에 넣는 방법을 모르겠습니다. 내가 시도한 것은 다음과 같습니다.

#!/bin/sh
(
echo "GET http://www.google.com/ HTTP/1.1"
echo
echo
echo "exit"
) | telnet proxy.ip port

그러나 그것은 나에게 전혀 출력을 제공하지 않습니다.

답변1

입력 및 출력 스트림을 제어하려면 다음을 수행할 수 있습니다.

#!/usr/bin/env bash

proxy_host="example.proxy.local"
proxy_port="8080"
uri="http://www.google.com/"

# This is the STDIN for telnet, keep in mind that this needs to be running
# as long as the request is handled. You can test the result by removing the
# sleep.
send_headers () {
  # Note the use of HTTP/1.0. 1.1 would keep the connection open
  # and you will need to wait for the 10 second timout below.
  echo "GET $uri HTTP/1.0"
  echo
  echo
  # 10 second timeout to keep STDIN open
  sleep 10
}

# This reads the telnet output per line, do your stuff here
while read -r line; do
  echo "$line"
done < <(telnet "$proxy_host" "$proxy_port" < <(send_headers))

구문은 command1 < <(command2)단지 역파이프입니다( 와 동일 command2 | command1). 이 예에서는 command2의 STDOUT 파일 설명자를 command1의 STDIN 파일 설명자에 연결합니다. 이 방법의 단점은 해당 파이프라인의 모든 "명령"을 실행해야 작동한다는 것입니다. 절전 모드가 제거되면 telnet 명령이 조기에 종료됩니다. 좋은 소식은 HTTP/1.0을 사용하면 10초의 send_headers 시간 제한을 기다리지 않고도 연결이 닫히고 파이프가 깔끔하게 닫힌다는 것입니다.

참고: 코드를 테스트할 프록시가 없으므로 귀하에게 도움이 되기를 바랍니다. :)

관련 정보