PerlのTelnetからのスクリーンスクレープ出力をスクリーニングするにはどうすればよいですか?
質問
PerlでTelnet接続を問題なくセットアップすることができ、呪いを発見したばかりで、2つを一緒に使用してTelnetセッションから出力をこすることができるかどうか疑問に思っています。
以下の単純なスクリプトを使用して、列の内容を列に基づいて表示できます。
use Curses;
my $win = new Curses;
$win->addstr(10, 10, 'foo');
$win->refresh;
my $thischar=$win->inch(10,10);
print "Char $thischar\n";
そして、以下を使用して、Telnet接続を開き、受信コマンドを問題なく送信できます。
use net::telnet;
my $telnet = new Net::Telnet (Timeout => 9999,);
$telnet->open($ipaddress) or die "telnet open failed\n";
$telnet->login($user,$pass);
my $output = $telnet->cmd("command string");
...しかし、私が本当にやりたいのは、Telnet応答(端子制御文字が含まれる)を取得し、呪いを使用して行列ベースで検索することです。誰もが私が2つを一緒に接続できる方法を知っていますか?呪いはstdoutでのみ動作できるように思えます
解決
あなたが探しています 用語:: VT102, 、VT102端子をエミュレートします(端子制御文字を仮想画面状態に戻す)。で使用する方法を示す例があります Net :: Telnet の vt102/examples/telnet-usage.pl (例ディレクトリは、何らかの理由でVT102ディレクトリ内にあります)。
私がこれを使用してから約7年が経ちました(私が自動化してWebベースのインターフェイスに切り替えていたシステム)が、以前は機能していました。
他のヒント
呪いは反対をします。これは、プログラムの書き込みからターミナルへの画面の更新を最適化するためのCライブラリであり、もともと遅いシリアル接続で使用されるように設計されています。コントロール文字のシーケンスからレイアウトをこする能力はありません。
より良い賭けは、このタイプの画面スクレイピングを行う機能を備えたAPIを備えた端末エミュレータです。私の頭の上から、オープンソースの端末エミュレーターがこれを行うかどうかはわかりませんが、確かに利用できる商業用のものがあります。
あなたはおそらくのようなものが欲しいです 予想
use strict;
use warnings;
use Expect;
my $exp = Expect->spawn("telnet google.com 80");
$exp->expect(15, #timeout
[
qr/^Escape character.*$/,
sub {
$exp->send("GET / HTTP/1.0\n\n");
exp_continue;
}
]
);
プレーンテキストコマンドと応答と純粋に対話している場合は、使用できます 予想 それ以外の場合は、それをスクリプト化するために使用できます 用語:: VT102, 、スクリープ(画面の特定の部分を読み取り、テキストの送信、スクロールのイベント、カーソルの動き、画面コンテンツの変更など)を使用してスクリーンコントロールを使用してアプリケーションを使用できます(例えば、Cursesライブラリを使用したアプリケーション) 。
または、を使用できます 脚本 このためのコマンド。
Solaris Man-Pageから:
説明
script
ユーティリティは、画面にすべての記録を作成します。レコードはに書かれています ファイル名. 。ファイル名が指定されていない場合、レコードはファイルに保存されます タイプスクリプト...スクリプトコマンドは、$ shellの値に従ってサブシェルを作成し、作成し、このセッションのテキストを記録します。スクリプトは、フォークされたシェルが終了するとき、またはControl-Dが入力されたときに終了します。
私はまた、期待の答えに投票します。 Gui'ishアプリケーションから同様のことをしなければなりませんでした。コントロールキャラクターを回避するためのトリック(退屈ではありますが)は、返された文字列からすべてのその他のキャラクターを剥奪することでした。それは、スクリーンスクレイプがどれほど厄介であるかに依存します。
例として、そのスクリプトからの私の関数は次のとおりです。
# Trim out the curses crap
sub trim {
my @out = @_;
for (@out) {
s/\x1b7//g;
s/\x1b8//g;
s/\x1b//g; # remove escapes
s/\W\w\W//g;
s/\[\d\d\;\d\dH//g; #
s/\[\?25h//g;
s/\[\?25l//g;
s/\[\dm//g;
s/qq//g;
s/Recall//g;
s/\357//g;
s/[^0-9:a-zA-Z-\s,\"]/ /g;
s/\s+/ /g; # Extra spaces
}
return wantarray ? @out : $out[0];
}