8

PerlでTelnet接続を問題なくセットアップでき、Cursesを発見したばかりで、2つを一緒に使用してTelnetセッションからの出力を取得できるかどうか疑問に思っています。

以下の簡単なスクリプトを使用して、STDOUTの内容を行、列に基づいて表示できます。

use Curses;
my $win = new Curses;
$win->addstr(10, 10, 'foo');
$win->refresh;
my $thischar=$win->inch(10,10);
print "Char $thischar\n";

そして、以下を使用して、telnet接続を開き、問題なく\receiveコマンドを送信できます。

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応答(端末制御文字を含む)を取得し、cursesを使用して行\列ベースで検索することです。私が2つをつなぐ方法を知っている人はいますか?呪いはSTDOUTでしか機能しないようです

4

6 に答える 6

5

呪いは反対のことをします。これは、端末に書き込むプログラムからの画面更新を最適化するためのCライブラリであり、元々は低速のシリアル接続で使用するように設計されています。一連の制御文字からレイアウトを取得する機能はありません。

より良い方法は、このタイプの画面スクレイピングを実行する機能を備えたAPIを備えたターミナルエミュレーターです。頭のてっぺんから、オープンソースのターミナルエミュレータがこれを行うかどうかはわかりませんが、それが可能な商用のエミュレータは確かにあります。

于 2010-02-10T11:25:52.927 に答える
4

あなたはおそらくExpectのようなものが欲しいでしょう

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;
                }
        ]
);
于 2010-02-10T10:58:54.237 に答える
4

プレーンテキストのコマンドと応答を純粋に操作している場合は、Expect toスクリプトを使用できます。それ以外の場合は、Term :: VT102を使用できます。これにより、画面のスクレイプ(画面の特定の部分の読み取り、テキストの送信、イベントの処理)を実行できます。スクロール、カーソル移動、画面コンテンツの変更など)画面制御にVT102エスケープシーケンスを使用するアプリケーション(たとえば、cursesライブラリを使用するアプリケーション)。

于 2010-02-10T18:01:25.753 に答える
3

VT102端末をエミュレートするTerm::VT102を探しています(端末の制御文字を仮想画面の状態に変換し直します)。VT102 / examples/telnet-usage.plにNet::Telnetでの使用方法を示す例があります(examplesディレクトリは何らかの理由でVT102ディレクトリ内にあります)。

これを使ってから約7年になりますが(自動化していたシステムをWebベースのインターフェースに切り替えました)、以前は機能していました。

于 2010-02-10T18:00:15.163 に答える
1

または、これにスクリプトコマンドを使用することもできます。

Solarisのマニュアルページから:

説明

scriptユーティリティは、画面に印刷されたすべての記録を作成します。レコードはファイル名に書き込まれます。ファイル名が指定されていない場合、レコードはファイル タイプスクリプトに保存されます...

スクリプトコマンドは、$ SHELLの値に従ってサブシェルをフォークして作成し、このセッションからのテキストを記録します。フォークされたシェルが終了するか、Control-dが入力されると、スクリプトは終了します。

于 2010-02-10T11:07:42.210 に答える
0

私はExpectの答えにも投票します。私は、GUIのアプリケーションから同様のことをしなければなりませんでした。制御文字を回避するための(面倒ではありますが)トリックは、返された文字列からその他の文字をすべて削除することでした。それは、画面のスクレイピングがどれほど乱雑になるかによって異なります。

例として、そのスクリプトからの私の関数を次に示します。

# 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];
}
于 2010-02-10T23:53:21.440 に答える