4

Linux サーバーで、システム情報を収集するためにルーターに telnet で接続することになっている Expect スクリプトを作成する途中です。これまでのところ、私のスクリプトは正常に接続を確立し、ルーター コマンドを実行し、切断して終了することができます。

このコマンドは、解析する必要がある数行を表示しますが、Expect でどうすればよいかわかりません。出力を保存し、行をgrepし、次に行から列を作成し、最後に結果をファイルに保存するにはどうすればよいですか? 可能であれば、回避策ではなく完全にExpectを使用したいと思います(たとえば、Bashに埋め込まれたExpectなど)。

御時間ありがとうございます。jk04

4

3 に答える 3

7

開発を期待するための 2 つのヒント:

  • autoexpect自動化のためのフレームワークをレイアウトする
  • exp_internal 1内部で何を期待しているかを詳細に表示します。これは、正規表現が期待どおりにキャプチャされない理由がわからない場合に不可欠です。
于 2010-01-16T21:02:38.330 に答える
6

基本的に、$expect_out(buffer) [1]。最後の予想一致から現在のものへの出力を保持します。そこにコマンド出力があります。

文字列操作には、tcl の組み込み [2][3] を使用するだけです。

  1. 「Expect でリモート コマンドの結果にアクセスする方法」http://wiki.tcl.tk/2958
  2. 「正規表現」http://wiki.tcl.tk/986
  3. 「文字列一致」http://wiki.tcl.tk/4385
于 2010-01-16T16:15:11.853 に答える
4

私はbashと対話するための同様の問題に直面し、解決しました。このアプローチは、操作なしの固定文字列出力を提供する他のインタラクティブな環境に一般化すると思います。

基本的には、コマンドを2つの固定文字列でラップしてから、これらの文字列を最初と最後に含むパターンを検索し、それらの間にコンテンツを保存します。例えば:

set var "";
expect $prompt { send "echo PSTART; $command; echo PEND;\r"; }
expect {
    -re PSTART\r\n(.*)PEND\r\n$prompt { set var [ string trim $expect_out(1,string) ]; send "\r"; }
    -re $prompt { set var "" ; send "\r"; }
    timeout { send_user "TIMEOUT\n"; exit }
}

このアプローチは、シェルのコメント文字、または既知の出力を返す単純なステータスコマンドでも機能すると思います。

次に、「var」のコンテンツを使用して、必要なことを何でも実行できます。

于 2011-05-02T19:08:02.990 に答える