アプリ版:「スタンプのみでお礼する」機能のリリースについて

telnet を使用して、たとえば web のデータを自動的に取得しようとしています。

80 番ポートに接続して

接続完了を待った後 http リクエストを出力する

ということを意図していますが、下記環境では動作しません。

なぜでしょうか?

$ uname -a
Linux srv4 2.6.32-36-generic #79-Ubuntu SMP Tue Nov 8 22:29:26 UTC 2011 i686 GNU/Linux

$ (sleep 3; echo "GET / HTTP/1.0"; echo;) | telnet www.google.co.jp 80
Trying 173.194.38.84...
Connected to www.l.google.com.
Escape character is '^]'.
Connection closed by foreign host.

よろしくおねがいします。

A 回答 (2件)

最後に待つ必要があります。

今のままだと、最後の「echo」で空行を出力したあと、すぐにパイプ入力元の「(sleep 3…echo;)」の実行が終了します。そうすると、そこで入力が途切れたtelnetは即座に実行を終了させてしまうのです。

あと、
・最初に3秒待つ必要はありません。
・Host: ヘッダは出力しておいた方が良いです。(質問者さんが挙げたgoogle も、Hostヘッダ無しだと 302 が返ってきます)

ですので、まとめると

(echo "GET / HTTP/1.0"; echo "Host: www.google.co.jp"; echo; sleep 3) | telnet www.google.co.jp 80

とすればうまくいきます。
(ただし、データ量が多く取得に3秒以上かかる場合は、sleepの時間を増やさないと、途中で終わってしまうことになります)
    • good
    • 1
この回答へのお礼

さっそく試して、うまくいきました。 ありがとうございます。

最初の sleep がいらなくて、最後に必要とはびっくりでした。

お礼日時:2011/12/17 14:59

telnetにリダイレクトは使えません。

他の手段を使ってください。
wget http://www.google.co.jp/
とか。

bashだと、リダイレクトを使って

#!/bin/bash
exec 3<> /dev/tcp/www.google.co.jp/80
echo GET / HTTP/1.1 >&3
echo Host: www.google.co.jp >&3
echo Connection: close >&3
echo >&3
cat <&3

とかも出来ます。
どうしてもtelnetをコントロールしたいのなら、expectというコマンドを使います。
    • good
    • 0
この回答へのお礼

そんな方法があるんですね! やっぱり質問してよかったです。 今後、参考にさせていただきたく思います。

教えていただき、ありがとうございました。

お礼日時:2011/12/17 15:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!