CTelnet for Win32/Linux の使い方  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ver 0.4 2001/10/28 ver 0.3 2000/09/05 ver 0.2 2000/08/30 ver 0.1 2000/07/22 江端智一 E-mail:See http://www.kobore.net/mailAddress.gif http://www.kobore.net/ 0. 変更履歴  ̄ ̄ ̄ ̄ ̄ ̄ ver 0.4 2001/10/28 - ライセンスの見直し(BSDライセンスへ変更) ver 0.3 2000/09/05 - プロンプト待ち以外の文字列を待つ場合(例えば、ログイン後の、 "su"による再ログインなどのケース)対応に、2つのメソッドを追加 した。 ver 0.2 2000/08/30 - プロンプト待ちの文字列の誤判定を避けるために、プロンプト待ち 時間を加えた。 ver 0.1 2000/07/22 - 初版 1. Copyright  ̄ ̄ ̄ ̄ ̄ ̄ Copyright (c) 2000,2001,2002,2003,2004,2005 Tomoichi Ebata. All rights reserved. 改変を加える場合も、加えない場合も、ソースとバイナリー形式での再配布、 使用は、下記の条件を満たした場合に許諾される。 1. ソースコードでの再配布物には、必ず上記の著作権表示、この条件リスト、 および以下の面責事項を、改変せずにファイルの最初の数行に入れなけれ ばならない。 2. バイナリー形式での再配布は、必ず上記の著作権表示、この条件リスト、 以下の面責事項の複製をドキュメンテーション内、あるいは配布と共にパッ ケージに入れられて提供される他の物の中に入れなければならない。 このソフトウェアは江端智一によって”現状のまま”提供されるものであり、 市場性があり売れる製品であるような含みを持たせ、特定の目的に適う製品で あるかのような、いかなる明示された保証はない。 また、なにか保証があるような含みを持たせた一切の保証の類からの責任も すべて拒否する。 著作者は直接的、非直接的、偶発的、特殊な、典型的、あるいは必然のいか なる場合においても、 いかなる損害に一切責任は負わない。 その損害は以下の内容も含み、しかもそれに限定されない。 代用となる物やサービスの調達、効果・データ・利益の低下、商取引の障害、 また、どのような責務の論理においても、それが契約に関するものであろうと、 厳格な責務であろうと、不正行為(不注意やその他の場合も含む)であろうと、 このソフトウェアを使用することによって生じるそれらの損害の、一切の責任 から著作者は免れている。 たとえ事前にそれらすべての損害への可能性が示唆されていた場合において も同様である。 2. What is "CTelnet for Win32/Linux" ?  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ "CTelnet for Win32/Linux"は、telnetのエージェントライブラリです。 CTelnetクラスを用いて、telnetの開始、コマンド入力、終了、および、そ の結果の取得を実施することができます。 以下のサンプルプログラムを見て頂ければ、使用方法を簡単にイメージでき ると思います。 // telnetTest.cpp : Defines the entry point for the console application. // #include "StdAfx.h" #include #include "telnet.h" void main(void) { CTelnet telnet("192.168.0.1"); if (!telnet.isConnect()) { printf("%s\n",telnet.getmsg()); return; } printf(".....Telnet connection successfully\n"); if (!telnet.login("guest","guest")) { printf("%s\n",telnet.getmsg()); return; } printf(".....Login successfully\n"); telnet.cmd("su", "assword:"); printf("%s\n",telnet.getmsg()); telnet.cmd("admin"); printf("%s\n",telnet.getmsg()); telnet.cmd("whoami"); printf("%s\n",telnet.getmsg()); telnet.cmd("ls -la"); printf("%s\n",telnet.getmsg()); telnet.cmd("dummy"); printf("%s\n",telnet.getmsg()); telnet.cmd("date"); printf("%s\n",telnet.getmsg()); telnet.cmd("mail"); printf("%s\n",telnet.getmsg()); telnet.cmd("exit"); } この程度のクラスライブラリは、Perl,Ruby等のスクリプト言語では、完全 にサポートされていますが、どういう訳か、C++に関しては見つけることが出 来ませんでした。 #ソースが公開されていないものなら、いくらでもあったのですが。 これは、一言で『探し方が甘い』のだとは思うのですが、探している時間で 作れるだろうと判断してしまいました。 その他、マルチプラットフォームでないと困るし、バグの原因がライブラリ の中にあると見つけ出すのが辛いし、後で色々遊びたいし、てな理由から、プ ログラム開発で言うところの、典型的な『車輪の再開発モデル』を正当に継承 しました。 あの『車輪の再開発』批判って、何か変だと思います。 「車輪」の製造過程で学ぶことも多いし、第一、車輪も作れんような奴は、 リヤカーや自動車は永久に作れません。 なにより、その「車輪」を作ってみたい人もいるでしょう(私のように)。 おかげで、RFC読んだりして、telnetの交渉プロトコルを勉強せざるを得な くなり、また一歩、IETF議長の座に近づいたと言うものです。 # 嘘です。 ## 頼まれたら、地の果てまで逃げます。 3. "CTelnet for Win32/Linux"が前提とする環境  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 正規表現ライブラリRegexのAPI,re_comp(),re_exec()が使える環境が必要で す。 Linuxは標準で持っているようですが、Windowsの標準ライブラリには入って いませんので、 http://www.kobore.net/soft/soft.html#Rexpdll を試してみて下さい。 4. 対応プラットフォーム  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ WindowsNT SP5 と、RedHat Linux 6.2Jで動作を確認しておりますが、可能 な限りプリミティブなAPIと型を使ったので、大抵のプラットフォームで、コ ンパイルは通ると思います。 最初は、文字列処理にSTLを使っていたんですが(遅くなろうが、でかくなろ うが、文字列扱いでは、絶対に楽ですから)、VC++でdllにしようとしたら、色々 面倒な作業が発生することが判り、また、万一STLがインストールされていな いとヤバイなあと思い、使用を断念しました。 5. CTelnet クラス  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ CTelnet::CTelnet( const char* host = "localhost", // 接続先ホスト名(IPアドレス可) int messageSize = 1024, // getmsg()のバッファサイズ const char* prompt = "[$%#>] ", // 待ちプロンプト(正規表現可) int port = 23, // Telnetポート番号 double loginTimeOut = 5.0, // Loginタイムアウト時間(秒) double waitTimeOut = 1.5 // cmd(),waitfor()タイムアウト // 時間(秒) ); CTelnetのインスタンスを生成し、Telnetコネクションを実施します。 CTelnet::~CTelnet() Telnetコネクションを切断し、インスタンスを消滅させます。 bool CTelnet::isConnect(); コネクションの確立を確認します。 確立に成功するとtrueを、失敗するとfalseを返します。 bool CTelnet::login( const char* user, // ユーザ名 const char* password ="" // パスワード ); ユーザ名とパスワードを入力し、認証を行います。 認証に成功するとtrueを、失敗するとfalseを返します。 bool CTelnet::cmd( const char* str // 入力コマンド ); コマンド入力を行います。 タイムアウト時間は、コンストラクタで設定された値を使います。 コマンド入力に成功するとtrueを、失敗するとfalseを返します。 bool CTelnet::cmd( const char* str, // 入力コマンド const char* waitstr // 検出文字列 ); コマンド入力を行い、特定の文字列(40文字以内)を待ちます。 タイムアウト時間は、コンストラクタで設定された値を使います。 コマンド入力に成功するとtrueを、失敗するとfalseを返します。 bool CTelnet::cmd( const char* str, // 入力コマンド timeval waitTimeOut // タイムアウト時間 ); コマンド入力を行います。 タイムアウト時間を指定できます。 コマンド入力に成功するとtrueを、失敗するとfalseを返します。 bool CTelnet::cmd( const char* str, // 入力コマンド const char* waitstr, // 検出文字列 timeval waitTimeOut // タイムアウト時間 ); コマンド入力を行い、特定の文字列(40文字以内)を待ちます。 タイムアウト時間を指定できます。 コマンド入力に成功するとtrueを、失敗するとfalseを返します。 bool CTelnet::waitfor( const char *str // 入力コマンド ); 特定の文字列が表われるまで、待ちます。 タイムアウト時間は、コンストラクタで設定された値を使います。 成功するとtrueを、失敗するとfalseを返します。 bool CTelnet::waitfor( const char* str, // 入力コマンド timeval waitTimeOut // タイムアウト時間 ); 特定の文字列が表われるまで待ちます。 タイムアウト時間を指定できます。 成功するとtrueを、失敗するとfalseを返します。 char* CTelnet::getmsg(void) login(),cmd(),waitfor()によってTelnetサーバから送られてきた、最新の メッセージを表示します。 login(),cmd(),waitfor()が失敗した場合は、最新のエラーメッセージを表 示します。 6. ソースファイルの内容  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ VC++のプロジェクトを丸ごと凍らせてありますので、解凍してお使い下さい。 ライブラリに必要なファイルは、以下の2つです。 telnet.cpp telnet.h 動作テスト用のファイルは、以下の通り。 telnetTest.cpp 正規表現ライブラリのソースも添付しておきます。本ソースを利用するに 当っては、http://www.kobore.net/soft/rexpdll.txt を御一読下 さい。 7. 動作確認方法  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Windows上での確認に関しては、適当なディレクトリ上で解凍した後、VC++ のプロジェクトを開いて、コンパイルして下さい。 Linux上での動作確認は、 telnet.cpp, telnet.h, telnetTest.cpp を適当なディレクトリに置いて、 gcc telnet.cpp telnetTest.cpp とした後、 ./a.out と入力すれば、動作確認できると思います。 Linuxの共有ライブラリ(未公開)も作ってみたのですが、telnet.cppが500ス テップ以下の短いプログラムなので、メインのプログラムと一緒にリンクする 使いかたの方が効率が良いと思います。 それと、telnetと言う非常にポピュラーな名前を、そのまま使うと、色々な 問題を引き起こすかもしれません。 共有ライブラリとして使う時には、ライブラリの名前に気をつけて下さい。 以上