ビジボックス環境にカールや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タイムアウトを待たずに接続が閉じられ、パイプがきちんと閉じられることです。
注:コードをテストするプロキシがないので、あなたに役立つことを願っています。 :)