1

私は自分自身にexpectスクリプトを教えてきましたが、expectスクリプトの正規表現に関していくつかの明確な質問があります。SunのiLOMsshセッションを生成し、SNMPエージェントを有効にするコードを作成しました。結局のところ、iLOM2とiLOM3はこのプロセスを異なる方法で処理するため、この問題を解決するためにこのスクリプトを作成します。正規表現を適切に一致させる方法を見つけようとしているときに、オンラインで多くの競合するソリューションに遭遇し、今ではかなり混乱しています。私が見つけた最高の助けは、expectマンページでした。私はなんとかうまくいくことができましたが、私の解決策が汚れていて、私が見つけたどの例とも一致しないのではないかと心配しています。だから私の実際の質問:私のコードはどのように機能していますか?もっと良い方法はありますか?

カスタムソリューションを盲目的にメッシュ化するのではなく、Expectスクリプトについてもっと学びたいと思っています。

注:この場合も、このコードは機能します。それがどのように評価されるかを学びたいです。

キャプチャする出力:

spawn ssh -o StrictHostKeyChecking=no root@<host>
Password: 

Sun(TM) Integrated Lights Out Manager

Version 2.0.2.6

Copyright 2008 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.

->

アイデアは「バージョン2」をキャプチャすることです。そこから2番を抽出します。

スクリプトスニペットを期待する:

set prompt "\\\->"
send "$pwd\r"
    expect {
            timeout { ...timeout action... }
            $prompt { ...regex didn't match action... }
            -indices -re {(Version (\d+).)} {
            #Regex to find ILOM Version.
                    if {[info exists expect_out(2,string)]} {
                            set ilom_version $expect_out(2,string)
                    } else { ...regex didn't match properly action...  }
                    expect $prompt
            }
    }

正確な正規表現は-indices-re{(Version(\ d +)。)}です。上でリンクしたexpectのマンページにはまったく異なる例があるため、最終的に機能する構文を理解するのに長い時間がかかりました。すなわち:-re "failed | invalid password"私がその構文を採用するときはいつでも、すべてがバラバラになります。「バージョン」、バージョン、{バージョン}、(バージョン)すべてが失敗します。

だから私は自分のコードがどのように機能しているか、そしてなぜそれが私が見つけたすべての例とそれほど違うのかについて混乱していると思います。任意のアイデアや提案をいただければ幸いです。お時間をいただきありがとうございます。

4

1 に答える 1

1

正規表現は、で囲まれているもの{}です。

(Version (\d+).)

Versionこれは、スペース、1つ以上の数字、任意の文字のいずれかを含む文字列と一致します。ドットは、任意の文字に一致するワイルドカード文字です。.文字通りの使用と一致させたい場合\.

パターンをで囲んだ()ので、一致全体がキャプチャされてに保存されexpect_out(1,string)ます。ただし、a )一致全体を使用しておらず、b)一致全体が自動的に保存されるexpect_out(0,string)ため、外側の角かっこは不要です。

また\d+、バージョン番号の先頭の数字がキャプチャされてに保存されるexpect_out(2,string)ように角かっこで囲んでいますが、上記のように外側の角かっこを削除すると、に保存されexpect_out(1,string)ます。

.数字に続くまたは数字は、その\.文字が存在しない場合に一致を防ぐ以外に、実際には何の目的も果たしません。

一致の-indicesインデックスを求めていないため、フラグは不要です。

そうでなければ、バージョン番号を抽出するためのあなたの方法はうまく見えます-しかし、私はExpectについてほとんど何も知りません:)

于 2013-03-01T18:58:48.540 に答える