人に聞けない痔の悩み、これでスッキリ >>

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で質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qtelnetで接続した先のコマンドのバッチファイルを作成したい

毎回動作確認のため、
1、クライアントPCからサーバへtelnetで接続して、
2、接続後、ログイン、動作確認のコマンドを打ちます。

毎回同じコマンドを打つので、
バッチファイルで対応しようかと思いますが可能でしょうか。
それとも他の別の方法がありますでしょうか。
宜しくお願いします。

1のバッチファイル
telnet 192.168.0.2

2のバッチファイル
(192.168.0.2のログインユーザ名)
(パスワード)
(動作確認のコマンド)…


のようなイメージかなぁと考えています。
よろしくおねがいします。

Aベストアンサー

以下のサイトは参考になりませんか?。
http://www.fpcu.jp/dosvcmd/bbs/log/cat1/4-0451.html

Qtelnetの自動シェルバッチを作成したい

UNIXは不得意のため、とても困っています。
是非、アドバイスをお願いします。m(_S_;)m

えっと。windowsでいえば、ブラウザにURLを設定するようなことを
UNIX上で、telnetを使って自動バッチを作成したいと思っています。


HTTP要求のURL: http:xx.xx.xx.xx:7001/TEST/test.srv?MODE=0

自分で書いてみたシェル
-------------------------------------------------
sleep 2;
echo ${USER_ID}
sleep 1
echo ${PASSWORD}
sleep 1
echo "GET /TEST/test.srv?MODE=0"
sleep 1
echo "exit"
| telnet ${SERVER_IP} ${WEB_POOT}
-------------------------------------------------

下記では、「ファイルもディレクトリもありません。」の
エラーが出てしますます。。

でもブラウザより上記のURLを入れて実行するぶんには
正常にhtmlを返してくれます。(バッチではhtmlを返さなくても可)

お手数をおかけしますが、どなたかもしアドバイス等が
御座いましたら、どうか宜しくお願い致します。

UNIXは不得意のため、とても困っています。
是非、アドバイスをお願いします。m(_S_;)m

えっと。windowsでいえば、ブラウザにURLを設定するようなことを
UNIX上で、telnetを使って自動バッチを作成したいと思っています。


HTTP要求のURL: http:xx.xx.xx.xx:7001/TEST/test.srv?MODE=0

自分で書いてみたシェル
-------------------------------------------------
sleep 2;
echo ${USER_ID}
sleep 1
echo ${PASSWORD}
sleep 1
echo "GET /TEST/test.srv?MODE=0"
sleep 1
echo "exit"
|...続きを読む

Aベストアンサー

http にアクセスするのに USER_ID や PASSWORD は要らないです。
もし Basic 認証なら、こんな感じで与える必要があります。

#!/bin/sh
(
sleep 1;
echo "GET /TEST/test.srv?MODE=0 HTTP/1.0"
sleep 1;
echo "Authorization: Basic ??????????"
sleep 1;
echo ""
) | telnet xxx.xxx.xxx.xxx 80

??????????は USER_ID:PASSWORD を BASE64 したものです。
ただ、telnet でやるより wget とか w3m あたりをインストールして使ったほうが簡単だと思いますが

Qsshやtelnetでログイン後、シェル(bash, csh)プロンプトからコマンド実行する方法は?

下記掲示板(CGI)の設置で至急、「sshもしくはtelnet」の情報が必要になりました。(メールによる掲示板への投稿機能で必要)
http://www.megumi-island.net/cgi.html#bbs

sshやtelnetでログイン後、シェル(bash, csh)プロンプトからコマンド実行する一番簡単な方法を教えてください。なお、当方OSはWindowsXP環境です。

シェルから下記コマンドを実行したいのです。

$ ./mi_mlpost.pl (と入力し、Enterキーを押す)

これでとりあえず第一難関クリアです。

付属のmi_mlpost.txtによれば、まだcronの設定があるようですが・・・

Aベストアンサー

>SMTPサーバーにログインしたようです。

>C:\>telnet www.****.com 25

SMTP(25番)サーバーにログインしちゃ駄目です。シェルが使えません。
単に、telnet www.***.com としてtelnetサーバーにログインしてください。
ユーザーIDとパスワードを聞いて来るのでそれを入れると、$ などと出るので、./mi_mlpost.pl と入れればいいです。

なお、暗号化されない件ですが、確かにsshの方がいいですが、ちょっと1,2度使う程度なら気にしなくていいと思います。


人気Q&Aランキング