1

perl と expect モジュールを使用して、サーバーの構成を自動化しようとしています。expect モジュールを 3 日間使用していますが、解決できない問題に遭遇しました。

私の問題は、成功した場合は出力を出力せず、何かがうまくいかなかった場合はエラーメッセージを出力するコマンドを実行するときです。このようなコマンドの例は、次のcdコマンドです。

$ cd .
$ 
$ cd sadjksajdlaskd
sadjksajdlaskd: No such file or directory.
$

私がやりたいことは、コマンドをサーバーに送信してから、expect呼び出しを実行して、プロンプト記号以外のものが出力されたかどうかを確認することです。このようなもの:

$com->send("cd $dir");
$com->expect(2, 
        ["^[^$#]*", sub {
                 my $self = shift;
                 my $error = $self->match();
                 die "ERROR: $error";
        }],
        "-re", "^[$#]"
);

私が抱えている問題は、呼び出しを実行すると、呼び出しexpect後に受信したテキストではなく、以前のすべてのテキストとsend一致するため、常に一致してエラーを報告することです。通話後に受信したテキストに対してのみ一致を期待するにはどうすればよいsendですか? 期待モジュールのバッファをクリアすることは可能ですか、またはこの種のエラー検出を別の方法で達成することは可能ですか?

また、expect モジュールが正規表現をどのように処理するのかも気になります。たとえば"^[$#]\$"、端末のプロンプトに一致する正規表現として使用する場合、正規表現の\$一部は行末または実際のドル記号に一致しますか? 私が\perlを削除すると文句を言います。

前もって感謝します!

/ハソ

編集:私は解決策を見つけました:

$com->clear_accum()解決策は、アキュムレータをクリアするものを使用することでした。以前使ってみたのですが、この機能はランダムにしか動かないようclear_accum()に思えます。

編集: についての最終的な注意clear_accum():

clear_accum()関数がランダムに動作しているように見える理由は、前の関数から生成されたテキストが、呼び出しが行わsendれるまでアキュムレータに読み込まれないためです。expect()したがって、以前のすべてのデータを完全にクリアするには、最初にexpect()呼び出しを実行してからアキュムレータをクリアします。

#To clear all previous data
$com->expect(0);
$com->clear_accum();
4

1 に答える 1

0
akarageo@Pal4op:~> cd banana
bash: cd: banana: No such file or directory
akarageo@Pal4op:~:( > echo $?
1

つまり、CD が返すエラー コードを確認します。0 はOKを意味し、それ以外はすべてエラーです。プロンプトを確認する必要はありません。ところで、CD コマンドはシェルが生成するプロンプトを生成しないため、これも混乱の一部に違いありません。

役に立ったら $object->exitstatus() を試してください

于 2013-07-12T10:03:04.293 に答える