Telnet で自動 HTTP リクエスト
(けんども日記)
expect の存在を初めて知りました.これは便利ですね.screen に初めて出会ったときと同じくらい感動しました.
少し前の,@Nifty セカンドメールのトラブルの時に知っていれば,どれだけ楽だったことか.サーバ側の動作が問題であることを確認したかったので,メーラ等は使わずに telnet で確認していたのですが,telnet で接続,チャレンジ文字列を元に md5sum でレスポンス文字列を計算,ログイン,を何度も繰り返していました.
今となっては既に解決されているので問題ないのですが,後学のためにログインスクリプトを書いてみることにしました....が,チャレンジ文字列からレスポンス文字列得る方法が分からない.そもそも,Tcl が全く分からないわけでして.
というわけで,Perl の Expect.pm モジュールを使ってみることにしました.
#!/usr/bin/perl
use Getopt::Std;
use Expect;
use Digest::MD5 qw(md5_hex);
my $host = '';
my $user = '';
my $pass = '';
my $timeout = 20;
my %opts;
getopt('hup',\%opts);
$host = $opts{'h'} if ( $opts{'h'} );
$user = $opts{'u'} if ( $opts{'u'} );
$pass = $opts{'p'} if ( $opts{'p'} );
my $e = new Expect;
$e->spawn('telnet',$host,'pop3');
$e->expect( $timeout, [qr/<.*>/] );
my $challenge = $e->match;
my $response = md5_hex("$challenge$pass");
$e->send("apop $user $response\n");
$e->expect( $timeout, "+OK" );
$e->interact;
$e->soft_close();
...同じことを Tcl な expect でやろうとしたら,どうなるんでしょう.

コメントする