web-dev-qa-db-ja.com

Telnetを使用してHTTP要求を送信する方法

Telnet を使用してWebページのコンテンツを取得する方法

たとえば、https://stackoverflow.com/questionsのコンテンツ。

56
kirillbobyrev

telnet ServerName 80


GET /index.html

35
ngille

できる

telnet stackoverflow.com 80

そして貼り付け

GET /questions HTTP/1.0
Host: stackoverflow.com


# add the 2 empty lines above but not this one

これが転写です

$ telnet stackoverflow.com 80
Trying 151.101.65.69...
Connected to stackoverflow.com.
Escape character is '^]'.
GET /questions HTTP/1.0
Host: stackoverflow.com

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
...
67
stefan bachert

後世についての質問は、http要求をhttps://stackoverflow.com/questionsに送信する方法でした。本当の答えは次のとおりです:telnetではできません。これはhttpsのみの到達可能なURLであるためです。

そのため、たとえば、このように、opensslの代わりにtelnetを使用することもできます。

$ openssl s_client -connect stackoverflow.com:443
...
---
GET /questions HTTP/1.1
Host: stackoverflow.com

これにより、https応答が提供されます。

28
dulaccc

以前の回答を多少拡張するには、いくつかの複雑な問題があります。

telnetは特にスクリプト化可能ではありません。代わりにnc(別名netcat)を使用することをお勧めします。これは、非端末入力と信号をより適切に処理します。

また、telnetとは異なり、ncは実際にSSLを許可します(したがって、httpsトラフィックの代わりにhttp-ポート80ではなくポート443が必要です)。

HTTP 1.0と1.1には違いがあります。プロトコルの最近のバージョンでは、POSTまたはGET行の後の別の行の要求にHost:ヘッダーを含める必要があり、その後に空行が続くことをマークする必要があります要求ヘッダーの終わり。

HTTPプロトコルには、キャリッジリターン/ラインフィードの行末が必要です。多くのサーバーはこれについて寛大ですが、一部はそうではありません。使いたいかもしれません

printf "%\r\n" \
    "GET /questions HTTP/1.1" \
    "Host: stackoverflow.com" \
    "" |
nc --ssl stackoverflow.com 443

HTTP/1.0にフォールバックする場合、Host:ヘッダーは必ずしも必要ではありませんが、多くの最新のサーバーではヘッダーが必要です。複数のサイトが同じIPアドレスでホストされている場合、サーバーはGET /foo HTTP/1.0からhttp://site1.example.com/foohttp://site2.example.net/fooかを知りません。これら2つのサイトが両方とも同じサーバーでホストされている場合( Host:ヘッダーが存在しない場合、HTTP 1.0サーバーは、必要なサイトとは異なるサイトにデフォルト設定されている可能性があるため、必要なコンテンツを取得できません。

HTTPSプロトコルは、これらの詳細においてHTTPと同一です。唯一の本当の違いは、セッションの初期設定方法です。

4
tripleee