プロキシを使用してシェルスクリプトからTelnet経由でHTTPヘッダー応答を取得する

プロキシを使用してシェルスクリプトからTelnet経由でHTTPヘッダー応答を取得する

ビジボックス環境にカールやwgetがないため、サーバー(google)からhttpヘッダー応答を取得するにはTelnetを使用する必要があります。また、私はプロキシの背後にあります。したがって、コマンドラインから次のことを正常に実行できます。

$  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タイムアウトを待たずに接続が閉じられ、パイプがきちんと閉じられることです。

注:コードをテストするプロキシがないので、あなたに役立つことを願っています。 :)

おすすめ記事