Telnet を使用してWebページのコンテンツを取得する方法
たとえば、https://stackoverflow.com/questions
のコンテンツ。
telnet ServerName 80
GET /index.html
できる
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
...
後世についての質問は、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応答が提供されます。
以前の回答を多少拡張するには、いくつかの複雑な問題があります。
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/foo
かhttp://site2.example.net/foo
かを知りません。これら2つのサイトが両方とも同じサーバーでホストされている場合( Host:
ヘッダーが存在しない場合、HTTP 1.0サーバーは、必要なサイトとは異なるサイトにデフォルト設定されている可能性があるため、必要なコンテンツを取得できません。
HTTPSプロトコルは、これらの詳細においてHTTPと同一です。唯一の本当の違いは、セッションの初期設定方法です。