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


10

コマンド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代わりにを使用するとGETGETメッセージ本文を除いて、リクエストを行った場合と同じレスポンスが返されます。
したがって、HEADHTTPヘッダーだけを調べたい場合に使用します。(つまり、応答の内容がシェル出力を乱雑にしないようにするためです。)


比較できるように、手動で実行する実際のコマンドを含めてもらえますか?GETあなたが投稿したものを実行すると、408 Request Time-outエラーが発生します。また、wget http://docs.python.org/2/license.htmlオプションではありませんか?
terdon 2013年

コマンドは正しいです。入力した瞬間にサーバーに接続していると思うtelnet docs.python.org 80ので、急いでこれらの2行を数秒以内に入力する必要があります(そうでない場合はコピーして貼り付けます)。そうしないと、サーバーがタイムアウトエラーを返します。
Bentley4 2013年

これらは、正確なコマンドです:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4

1
私は、あなたが入力する必要が理由だと思う<ENTER>HTTPプロトコルはリクエストヘッダの後に余分な空白行を必要とするので、最後に二度目です。HTTP Wiki記事リクエストメッセージセクションを参照してください
Bentley4

1
理論的には、あなたはできるはずですtelnet < request.txtが、私はGETコマンドを機能させることができません。
terdon 2013年

回答:


21

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

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

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


Telnetはどのように「より速く」そして「より簡単」になり、netcapですか?この場合、その点で使用方法に違いはありません。
Bentley4 2013年

確かにこのケースには当てはまりませんが、人々(私を読んで、どうやらあなたは!!!)はtelnetを使用する傾向があると思います。 Windowsにはプリインストールされていません。
davidgo 2013年

5

私は実際に経験はありませんが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

かっこよくわかりませんでしたexpect。davidgoの回答を選択したのは、それがこのケースに最適なソリューションだからです。達成したいことについて、netcapとtelnetの使用法の違いはわかりません。それにもかかわらず、Terdonの努力に感謝します。もし私があなたの答えをもっと賛成できれば、私はそうします。
Bentley4 2013年

1
@ Bentley4問題ありません。使用するのncがより良い解決策です。受け入れる必要があります。
terdon 2013年

interactそのexpectスクリプトを終了する正しい方法がどのように見えるか私は見落としています。
2015年

@ 2rs2ts私は期待についてほとんど知りません。あなたは正しいかもしれませんが、あなたのコメントがなぜそれが間違っていると思うのか教えてくれなかったので、私にはわかりません。私の理解は、interact「ユーザーに現在のプロセスの制御を与えることで、キーストロークが現在のプロセスに送信され、現在のプロセスのstdoutとstderrが返される」(つまりman expect)です。つまり、interactユーザーに実際にtelnet接続を使用する方法を提供する方法です。
terdon 2015年

元の質問は、ファイルの内容をtelnetやり取りするのではなくフィードすることに関するものだったので、それで終わるべきだと思いますclose -i $spawn_id。その後、スクリプトは終了します。とinteract私は実際にはtelnetまったく終了することができず、私の端末を閉じる必要がありました。かなり悲惨です(それは部分的に私のせいだったかもしれません。)
2rs2ts
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.