1

いくつかのCiscoネットワークデバイスにアクセスするためのPythonスクリプトを作成しようとしています。残念ながら、デバイスは同じように設定されておらず、奇妙な場所に表示されるバナーが表示されているものもあります。これらのバナーには、プロンプトと同じものがいくつかあるパターンが含まれている場合があります。

たとえば、ログインするとのプロンプトが表示される'hostname#'ので、基本的にはpexpect('#') Iを使用しますが、他の特定のプロンプトも処理する必要がある場合があります。可能なプロンプトのリストに加えて、タイムアウトを実際に用意し、それに応じて動作します。 'hostname>'pexpect('>')

バナーが中央のどこかに表示されない限り、これは問題ありません。たとえば、ログインした後 ## Welcome ##、プロンプトの直前に「」というバナーが表示される場合があります。pexpectに正規表現を無視するように指示できれば#.*\r大丈夫だと思いますが、それが可能かどうかはわかりません。pexpectに文字列を無視させることは可能ですか、それともこれを回避するためのより良い方法がありますか?

4

3 に答える 3

2

掲示板の時代に使用していた解決策は、プロンプトを探すことでした。プロンプトが表示されたら、すぐに改行または1〜2秒のタイムアウトのあるスペースを探します。2回目の待機がタイムアウトした場合、それは私が本当にプロンプ​​トで待機していたことを意味します。正規表現を使用しているため、プロンプトから1秒以内に文字を受信するかpexpectどうかを実際に確認できます。

def wait_for_prompt(session, prompt, timeout=1):
    gotprompt = 0
    while not gotprompt:
        session.expect(prompt, timeout=None)
        gotprompt = session.expect([".", pexpect.TIMEOUT], timeout=timeout)

child = pexpect.spawn("ssh ...")
wait_for_prompt(child, "[#>] ?")

私はこれまでこのライブラリを実際に使用したことがないので、微調整が必​​要になる場合がありますが、これは80年代にうまく使用したアプローチです。:-)

于 2012-06-01T16:24:56.257 に答える
2

Python pexpectモジュールは、一致する入力を待機します。あいまいな入力や望ましくない入力と一致しない正規表現を作成する場合を除いて、実際に入力を無視することはできません。ただし、1つの非常に複雑な正規表現を作成する代わりに、pexpectは正規表現のリストを処理することもできます。次に、これらの正規表現を固定して、あいまいさを減らします。

たとえば、一致を行の先頭または末尾に固定し、可能な限り正確に一致させることで、コマンドプロンプトとバナーを簡単に区別できます。

users = ['fred', 'ginger']
user_prompt = '^(?:%s)@.*?\$ $' % '|'.join(users)
child.expect (['hostname# $', 'hostname> $', user_prompt])

重要なのは、一致させたい入力を理解し、アンカーを使用して明確な正規表現を作成し、不一致が見つかったときに式を更新することです。これは、過度に貪欲なパターンを作成しなかったため、あまり頻繁に行われないことを願っています。そもそも。

于 2012-06-01T17:15:53.757 に答える
0

一致が見つかると、expectはプロセスインスタンスに「before」、「after」、および「match」属性を設定します。これらを使用して、いくつかのロジックを作成できます。

または、必要なプロンプトにのみ一致する、より優れた正規表現を作成することもできます。r'> $ |#$'でさえ、行の終わりにあるそれらの文字とのみ一致するため、おそらくあなたが望むことをするでしょう。

于 2012-06-01T16:10:43.673 に答える