2016-08-12 5 views
0

Expectの実装については特にJavaにこの質問をしています。しかし、私は一般的な提案も知りたい。プログラミングを期待する:何が求められるのか正確に期待するには?

Expectプログラミングでは、新しいプロセスを作成した後にプロンプ​​トが表示されることを正確に予想できますか?

たとえば、パターンや固定文字列を期待するのではなく、何が求められているかを予期しておく方が良いとは限りません。私はこれが時には本当に役に立つべきだと感じています(特に条件付き送信がない場合)。

は、リモートマシン上のsshを行うと、コマンド(lspwdmkdir testdir)のリストを実行するためにJSchExpect4j Javaライブラリを使用して、ここでsample java codeを考えてみましょう。

ここで私の質問は、プロンプトのパターンを指定する必要があるのですか? Channelから正確なプロンプトを得ることはできないのでしょうか?

+4

例を挙げてこれを明確にすることはできますか? –

+1

Gotcha。申し訳ありません、お手伝いできません - ちょうどここにJavaタグがあります。 –

答えて

0

"expect"と "java"でプログラミングしました。

「期待している」とは基本的には間違っていると思います。新しいプロセスを作成した後で、正確な項目を探すことはありません。コードのブロックに結合されたパターンの端子

  • セット(典型的には、正規表現)、読み出し

    1. 何か:Anはプログラム期待

      は、基本的に構成されています。

    ので、新しいプロセスが起動されたときに、もちろんこの

    while (terminal.hasMoreText()) { 
        buffered_text += terminal.readInput(); 
        for (Pattern pattern : patterns) { 
        if (pattern.matches(buffered_text)) { 
         String match = pattern.getMatch(buffered_text); 
         bufferedText.removeAllTextBefore(match); 
         bufferedText.removeText(match); 
         pattern.executeBlock(); 
        } 
        } 
    } 
    

    ようになり、ループがあります、これは、大規模な一般化したものです。しかし、プロセスを立ち上げた後、それ自体が期待していることを「正確に期待」していないことを説明するのには十分です。 expectインタプリタに提供されるプログラム(主にパターンとパターンが一致したときに実行されるコードブロックで構成される)は、インタプリタのループがプロセスの出力と一致するために使用する項目を含んでいます。

    これは、かなり奇妙な予想スクリプトが表示される理由です。たとえば、ログインプロンプトが大文字か小文字かに一貫性がないため、ほとんどの人が「ログイン:」ではなく「ogin:」を「期待」しています。

  • +0

    あなたの説明をありがとう。私の質問は、なぜ「端末から読み取ったもの」が「パターンのセット」の1つではないのかということです。 –

    +0

    @jnanthak "端末から読み取ったもの"はパターンが一致するものです。ターミナルに印刷される多くのものは、比較的安定したテキストと信頼性の高いテキストを含んでいます。 "ogin:"のようなパターンは "Login:"、 "login:"と一致し、 "不正なエントリー、ログインを告訴する警告:"、 "ようこそ、今日の日付は7/11です\ nlogin:"期待のパワー言語は、正確な詳細をスキップして、重要な部分を探すことです。 –

    +0

    @jnanthak厳密なマッチングは悪い考えではありませんが、入力が変化すると、プログラムが実行され、そのバッファに入力を受け取るまで、正確に一致する正しいパターンを書くことは不可能です。つまり、プログラミング言語を使用して、それを受け取っていたときの入力に基づいてプログラムを実行する必要がありました。このようなシナリオでは、プログラミング言語が不要な部分になり、(プログラムタイプを入力するのではなく)直接入力することもできます。 –

    0

    あなたは何も期待する必要はありません。ただちにコマンドを無差別に送信するのは自由です。

    間違った時間に間違ったことを言って誤って何かを破棄しないように、特定のプロンプトに返信するだけの良い方法ですが、これは完全に自由です。

    主な考慮事項は、あなたの通常の流れがあるかもしれないしながら、ということである。

    なし期待に
    $ create-backup 
    $ mkdir latest 
    $ mv backup.tar.gz latest 
    

    とやみくもに入力を書いて、あなたはこれで終わることができます。

    $ create-backup 
    Disk full, cleanup started... 
    Largest file: precious-family-memories.tar (510MB) 
    [R]emove, [S]ave, [A]bort 
    Invalid input: m 
    Invalid input: k 
    Invalid input: d 
    Invalid input: i 
    Removing file... 
    $ latest 
    latest: command not found 
    $ mv backup.tar.gz latest 
    

    そのプログラムのに対し、続行する前に$が待つだけで、最終的には計画通りに進まないことに気付くでしょう。

    いくつかのコマンドは、タイミング(例えば、telnet)に敏感ですが、何かを待つかどうかを問わずいつでもコマンドを送ることができます。

    +0

    はい、同意します。何も期待せず、すべてを送ることは非常に危険です。何を求めようとしているのは、新しいシェルが生成されたあと、新しいシェルから '$'をキャプチャして期待通りに使用できるかどうかということです。これにより、expectスクリプトはプロンプトとは独立して動作するはずです。 –

    +0

    いいえ、シェルコマンドプロンプトを一般に認識する方法がないため、これを行う方法はありません。それは任意の文字を使用するようにカスタマイズすることができ、派手なカラフルなプロンプトがよくあります。 'cd foo && ls && pwd'のような単一の複合コマンドを実行する方が良いでしょう。それは適切なシーケンシングを担当します –

    関連する問題