HTTPがどのように機能するかについてさらに学ぶために、netcatをいじってみました。その一部をbashまたはPerlでスクリプト化したいのですが、テストの早い段階で障害にぶつかりました。
プロンプトから直接netcatを実行し、HEAD要求を入力すると、機能し、プローブしているWebサーバーのヘッダーを受け取ります。
これは機能します:
[romandas @ localhost〜] $ nc 10.1.1.2 80 HEAD/HTTP/1.0 HTTP/1.1 200 OK MIME-バージョン:1.0 サーバー:編集済み コンテンツ長:0 キャッシュ制御:パブリック 有効期限:土、2050年1月1日18:00 :00 GMT [romandas @ localhost〜] $
しかし、同じ情報をテキストファイルに入れて、パイプまたはリダイレクトを介してnetcatにフィードすると、スクリプトの準備の際にヘッダーが返されません。
テキストファイルは、HEADリクエストと2つの改行で構成されています。
ヘッド/ HTTP/1.0
echoまたはprintfを介して同じ情報を送信しても機能しません。
$ printf "HEAD/HTTP/1.0\r\n"; | nc -n 10.1.1.2 80 $/bin/echo -ne 'HEAD/HTTP/1.0\n\n' | nc 10.1.1.2 80
私が間違っていることはありますか? bashの問題なのか、echoの問題なのか、netcatの問題なのかはわかりません。
Wiresharkを介してトラフィックをチェックし、成功した要求(手動で入力)は2番目のパケットで末尾の改行を送信しますが、echo、printf、およびテキストファイルのメソッドは同じパケットに改行を保持しますが、原因がわからないこの動作。
「\ r\n」を2ロット必要とし、netcatに応答を待つように指示する必要もあります。 printf "HEAD / HTTP/1.0\r\n\r\n" |nc -n -i 1 10.1.1.2 80
または同様のものが機能するはずです。
もう1つの方法は、「ヒアドキュメント」規則と呼ばれるものを使用することです。
$ nc -n -i 1 10.1.1.2 80 <<EOF
> HEAD / HTTP/1.0
>
> EOF
Ncに応答を待機させる別の方法は、入力にスリープを追加することです。例えば.
(printf 'GET / HTTP/1.0\r\n\r\n'; sleep 1) | nc Host 80
以下のnetcatコマンドを使用して、インスタンスをウェブサーバーにすることができます。
MYIP=$(ifconfig eth0|grep 'inet addr'|awk -F: '{print $2}'| awk '{print $1}')
while true; do echo -e "HTTP/1.0 200 OK\r\n\r\nWelcome to $MYIP" | Sudo nc -l -p 80 ; done&
この行も同等に機能します。
echo -e "HEAD / HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80