netcatを使ってHTTP経由でURLを取得する方法は?

netcatを使ってHTTP経由でURLを取得する方法は?

bad requestこのコマンドを実行すると、なぜこれが起こるのか教えてくれる人はいますか?

echo -e "GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1\n\n" | nc www.yellowpages.com 80 

同じウェブサイトがブラウザで正常に開くことができます。

答え1

HTTP要求のヘッダーはCRLF(Windows)行末を使用する必要があります。 (望むよりウィキペディアまたはRFC 2616.) 多くのサーバーは拡張機能として LF(Unix) 行末をサポートしますが、このサーバーはサポートしていません。

また、HTTP 1.1にはHost:次のヘッダー行が必要です。ウォーレン・ヤングは指摘した。。 (望むよりウィキペディアまたはRFC 2616)。

echo -e "GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1\r\nHost: www.yellowpages.com.eg\r\n\r\n" | nc www.yellowpages.com 80

またはより明確

sed $'s/$/\r/' <<EOF | nc www.yellowpages.com 80
GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1
Host: www.yellowpages.com.eg

EOF

しかし、有効なリクエストを簡単に設定し、必要に応じてカスタムヘッダーを指定できるwgetまたはカールを使用するとどうなりますか?

答え2

GET要求にドメイン名を含める必要があります。nc接続しようとしているドメイン名を教えて、サーバーが見つかる場所を知っていますが、ncサーバーに転送しません。サーバーが複数のドメインをホストしている場合、どのドメインを送信するかは不明です。転送する要求ヘッダーには、echo次のドメイン全体を含める必要があります。

echo "GET http://domain.tld/path" | nc domain.tld 80

引数をechoに入れて、-e末尾からエスケープされた改行文字を削除することもできます。これは-e、改行文字を追加しようとするエコーの自然な傾向を抑制し、直接改行文字を追加することです。

編集1:curlすべてのヘッダーの可能性を処理し、便利な出力を提供できるような一般的なダウンロードツールを使用しない理由はありますか?タイトルチャットを直接処理する必要がありますか?curl http://domain.tld/pathプログラマがあなたのためにすべての可能性を解決したので、より安定した出力を提供する必要があります。

編集2:バラよりウォーレンの答えプロトコル仕様に関する情報です。重要な要約:1.1を指定する場合は、そのプロトコルに準拠する必要があります。 1.0 を指定すると、通常は上記のようにリクエストできます。

HTTP/1.1 を使用して echo と netcat を介してリクエストするには、以下を試してください。

echo "GET http://domain.tld/path HTTP/1.1\nHost: domain.tld\n" | nc domain.tld 80

答え3

HTTP 1.1必要HostGET要求に1つ以上のヘッダーを送信します。つまり、最小法的要件は次のとおりです。

GET http://www.example.com/noise/and/junk HTTP/1.1
Host: www.example.com

(もちろん、ヘッダー部分を終了するにはCRLFを追加する必要があります。)

HostHTTP 1.1が必要であると主張しているがヘッダーを含まない要求を処理できるHTTPサーバーがいくつかある可能性がありますが、サーバーはこれらの要求を拒否することが正しいです。

Host名前ベースの仮想ホスティングをサポートするには、HTTP 1.1拡張が必要です。アクセスしたいサイトに専用サーバー(または少なくとも専用のIP)がある場合は、安全にHTTP 1.0に置き換えて1行のHTTP要求を実行できます。

GET http://www.example.com/noise/and/junk HTTP/1.0

関連情報