web-dev-qa-db-ja.com

テキストファイルの内容をコマンドとしてtelnetに送る

コマンドtelnet docs.python.org 80を使用すると、実際のリクエストを入力して、http://docs.python.org/2/license.htmlへの手動のHTTPリクエストを実行できます。

次に、ライブで入力する代わりに、テキストファイルからリクエストをフィードします。

私はこれを試しました:

cat request.txt|telnet docs.python.org 80


request.txt

GET /2/license.html HTTP/1.1 
Host: docs.python.org

(ファイルを空白行で終了する必要があります。そうしないと、不正な要求が発生します!)


しかし、サーバーへの接続はすぐに閉じられます。

request.txttelnet docs.python.org 80に正しくパイプするにはどうすればよいですか?


編集:

知っておくと便利です。 HEADの代わりにGETを使用すると、メッセージ本文を除いて、GETリクエストを実行した場合と同じレスポンスが返されます。
したがって、HTTPヘッダーだけを調べたい場合は、HEADを使用します。 (つまり、応答の内容がシェル出力を乱雑にしないようにするためです。)

10
Bentley4

「telnet」ではなくnetcat(ncコマンド)を使用するので、

 cat request.txt | nc docs.python.org 80 

Telnetは素早く簡単なハックですが、netcatは明らかに、この仕事に適したツールです。

21
davidgo

私は実際にtelnetの経験はありませんが、ファイルリダイレクトから入力を受け取ります。

telnet < abc.txt

次のようにして、サーバーに正しく接続できます。

$ cat abc.txt
open docs.python.org 80
$ telnet < abc.txt
telnet> Trying 82.94.164.162...
Connected to dinsdale.python.org.
Escape character is '^]'.
Connection closed by foreign Host.

多分あなたはそれがGETコマンドを受け入れるようにする方法を理解することができますが、私はできませんでした。別の方法は expect スクリプトを使用することです:

#!/usr/bin/expect

spawn telnet docs.python.org 80
expect "Escape character is '^]'." { 
     send "GET /2/license.html HTTP/1.1\nHost: docs.python.org\n\n" 
}
interact

次に、スクリプトをtelnet.expとして保存し、実行可能にして実行します。

./telnet.exp > output.html
5
terdon