telnetでHTTPリクエストを送信するには?
- 2012.05.07
- Linux 開発環境/開発ツール
- demo
telnetクライアント(以下telnet)を使うと通常ブラウザが自動で送信しているリクエスト情報を0から指定できたり、ブラウザからでは見えないレスポンスヘッダ(プラグインがあれば見れるブラウザもある)を手軽に見ることができます。
例えば携帯サイトを作っていると、携帯端末から送信されるIDや特殊なヘッダをエミュレートしてアクセスしたい時が多々あります。
PCブラウザのFireFoxでは色々プラグインがあり、携帯端末からのアクセスをエミュレートしてくれるものがありますが、IDや特殊なヘッダはエミュレートしても、その他のヘッダ(Accept-Encoding等)が携帯ブラウザとは違ったりと、100%ではありません。また、値を変えたい時はプラグインの設定を変更しなければいけないので、少し手間です。
telnetを使う方法では毎回送信するリクエスト情報を入力する必要はありますが、一旦リクエスト情報をメモしておいて、コピペをすればその手間はなくなります。そして入力した情報だけがそのままサーバに送信されるので意図しないヘッダが追加されるようなこともありません。また、telnetを使う方法はLinuxでもWindowsでも手軽に使えるので、サーバ上や出先で借りたPC等、自分が普段使っている環境じゃなくても使えます。
※Windowsにtelnetコマンドがない場合は、「Windowsの機能の有効化または無効化」から「Telnetクライアント」にチェックを入れて有効にしてください
今回は弊社HPに携帯電話のUser-Agentでアクセスすると、携帯専用のページにリダイレクトされるようになっているのですが、本当にその通り動作するかを確認するというシチュエーションで解説します。
今回はWindowsのコマンドプロンプトからtelnetを使う場合の解説をします。
Windowsのtelnetは決して使いやすいソフトウェアではありません(もっと高機能で使いやすいtelnetクライアントが存在します)。ですが、出先で借りたWindows機でサイトの確認をしなければいけないような状況では、Windowsのtelnetしか使えないことがあります。この機会に使えるようにしておきましょう。
※その他telnetでも操作方法はほとんど同じです
直接該当サーバに接続して確認する場合
HTTP Proxy等を使わず、該当サーバに直接アクセスできる場合は以下の手順で行います。
コマンドプロンプトからtelnetコマンドで以下のようにWEBサイトのホスト名(or IPアドレス)とWEBサーバがリスニングしているポート番号を指定して接続します。
Windowsのtelnetは、デフォルトの状態だとローカルエコーが無効になっているので、このままだと入力した文字が見えません。
見えないだけでリクエスト情報は入力・送信できますが、操作も説明もしにくいので、ローカルエコーを有効にしましょう。
Ctrl + ] を押下すると、サーバとのセッションを一時的に抜け、telnetコマンドプロンプトに戻ることができます。次にset localechoと入力し、Enterを押下します。これで、ローカルエコーが有効になりました。
さらにもう一度Enterを押下し、WEBサーバに接続したセッションに戻ります。
まだ何も入力してないので、戻った直後は画面には何も表示されていません。
ここからリクエストの入力をしていきますが、注意しなければいけないのは、Windowsからtelnetを使用して該当サーバに接続している最中は、各種キーを押下するたびにサーバにキーデータが送信されます。バックスペースなどもそのままサーバに送信されるので、打ち間違いなどがあると最初からやり直しになります。入力には気を付けてください(LinuxはEnterのタイミングで送信されますので、それまでの間は入力した文字を修正可能です)。
では実際に、以下のように入力します。
通常のHTTPリクエストと同じです。1行目のリクエストラインでHTTPバージョンを1.0にしているのは、KeepAliveを使わず1リクエストでコネクションを終了させるためで、別に1.1でも問題ありません。2行目以降は送信したいリクエストヘッダを記述します。今回は、サイト確認に必要な最低限のヘッダだけを送信します。もし、特殊なリクエストヘッダを送信したい場合は、ここに続けて送信したいヘッダを記述します。Cookie等も指定できるので、いろいろ試してみてください。
最後に空行のままEnterを押下します。すると、サーバからレスポンスが帰ってきます。ブラウザからだとリダイレクトのレスポンスは確認する間もなく別のページへ遷移してしまいますが、telnetだとこのように生のレスポンスが見ることができます。
HTTP Proxyを使用しつつ確認する場合
使用している環境によってはHTTP Proxy(フォワードプロキシ)を使用しないと外部にアクセスできなかったり、経路上許可されていない場合があります。HTTP Proxyを使いつつ該当サーバにアクセスするには以下の手順で確認します。解説で使用するHTTP Proxyサーバのホストはproxy.symmetric.localでポートは18080とし、確認するサイトは同じく弊社HPとします。
コマンドプロンプトからtelnetコマンドで以下のようにHTTP Proxyサーバ(以下Proxyサーバ)のホスト名(or IPアドレス)とProxyサーバがリスニングしているポート番号を指定して接続します。
先に説明したように、最初はローカルエコーをオフにします。その後、以下のように入力します。
注意するのは1行目のリクエストラインです。直接WEBサーバにつなぐ場合はホスト名以降のパスだけでいいのですが、Proxyサーバ経由でアクセスする場合は、接続先の完全なURLを指定します。また、HostヘッダはProxyサーバのホスト名を指定します。あとは同じく最後に空行のままEnterを押下します。すると、サーバからレスポンスが帰ってきます。レスポンスを見ると、正しくリダイレクトされていることがわかります。Proxyサーバを経由している場合は、レスポンスヘッダにProxy-Connectionが追加されていることがわかります。
今回はWindowsからtelnetクライアントを使用する場合の解説をしました。最初にも書きましたが、その他telnetクライアントでも操作は同じです。また、Linuxではデフォルトでローカルエコーが有効なので、いちいちローカルエコーをONにする作業は必要ありません。
参考:Telnetコマンド