netcatを使用したHTTPヘッダーリクエストのスクリプト作成
質問
私はnetcatをいじってHTTPの仕組みをもっと学ぼうとしています。その一部をbashまたはPerlでスクリプト化したいのですが、テストの早い段階で障害にぶつかりました。
netcatをプロンプトから直接実行してHEADリクエストを入力すると、動作し、調査中のWebサーバーのヘッダーを受け取ります。
これは動作します:
[romandas@localhost ~]$ nc 10.1.1.2 80 HEAD / HTTP/1.0 HTTP/1.1 200 OK MIME-Version: 1.0 Server: Edited out Content-length: 0 Cache-Control: public Expires: Sat, 01 Jan 2050 18:00:00 GMT [romandas@localhost ~]$
しかし、同じ情報をテキストファイルに入力し、パイプまたはリダイレクトを介してnetcatにフィードすると、スクリプト作成の準備として、ヘッダーが返されません。
テキストファイルは、HEADリクエストと2つの改行で構成されています:
HEAD / 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の問題なのか、エコーの問題なのか、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
などが機能するはずです。
他のヒント
別の方法は、「heredoc」規則と呼ばれるものを使用することです。
$ nc -n -i 1 10.1.1.2 80 <<EOF
> HEAD / HTTP/1.0
>
> EOF
ncが応答を待つもう1つの方法は、入力にスリープを追加することです。例:
(printf 'GET / HTTP/1.0\r\n\r\n'; sleep 1) | nc HOST 80
以下のnetcatコマンドを使用して、インスタンスWebサーバーを作成できます。
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