3

Expect を使用して、SSH セッションおよび ERP プログラムと自動対話しています。

私のexpectスクリプトで変数をキャプチャするために正規表現に頼るのではなく、ユーザーから特定のキーストロークを受け取ったときに、画面領域、たとえば1つのフィールドをコード内の変数にキャプチャすることは可能でしょうか? サーバーに他のコマンドを送信し、フィールドを再送信しますか?

注文番号が 6、12、6、18 (6 は行、12-18 は列) に含まれており、6 桁の注文番号が含まれているとします。行 6 列 12 から 18 までの注文番号を変数にコピーしたい。次に、ユーザーがもう少し対話できるように (または別のメニューに移動することを期待して)、別のメニューで注文番号を再送信します。

だから私の質問は次のとおりだと思います:現在の画面の内容は1つのバッファにありますか? (セッション全体ではありません) 画面上のその行と列の範囲にのみ存在する特定のデータ要素だけを抽出できますか?

サンプル擬似コード:

#!/usr/bin/expect -f
set env(TERM) vt100
spawn ssh -Y user@domain
#... set user/pass and other vars...
#... send commands to log into ERP
#don't time out
set timeout -1 
        interact {
                -reset $CTRLZ {exec kill -STOP [pid]}
                $CTRLA   {   
                        exp_send "menu_address\ry\r"
                }
                $CTRLO   {   
                        #...acquire order number variable...
                        #...some code I don't understand yet...

                        exp_send "menu_exit_sequence\r"
                        exp_send "menu_address\r"
                        exp_send $ordernumvar

                }
                ~~
        }
4

3 に答える 3

1

実際、 Expect に付属するterm_expectサンプル プログラムはまさにこれを行うことができます。カーソルでアドレス指定できる端末をエミュレートし、特定の画面位置で出力をテストできます。私の ActiveTcl ディストリビューションでは、これは demos/Expect/term_expect にあります。

于 2010-01-07T11:23:48.577 に答える
0

ERPの出力をデバッグするために、exp_internalを使用して出力文字を取得できることがわかりました。

exp_internal -f file 0

その出力は私に与えました:(私の番号は076338でした)

spawn id exp0 sent <0>^M
spawn id exp6 sent <0>^M
spawn id exp0 sent <7>^M
spawn id exp6 sent <7>^M
spawn id exp0 sent <6>^M
spawn id exp6 sent <6>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <8>^M
spawn id exp6 sent <8>^M
spawn id exp0 sent <\r>^M
spawn id exp6 sent <\r\n\u001b[1;14H>^M

だから今、私はフィールドを取得するために正規表現を理解する必要があります。私はこれを持っていました:

-nobuffer -re {^([a-zA-Z0-9]{1})?[0-9]{5}$} {
    set ordernumber $interact_out(0,string)
}

しかし今、私はこれを組み込む必要があります:

^([a-zA-Z0-9]{1})?[0-9]{5}

これを表すいくつかの正規表現を使用すると、次のようになります。

\r\n\u001b[1;14H

そして、それを$ ordernumber変数に格納したら、終了文字列の前の文字だけを何らかの方法で分離して、それらを変数に格納する必要があります。

于 2010-01-04T19:36:25.093 に答える
0

いいえ、特定の行/列で画面から何かをつかむことはできません。ただし、そもそも情報がどのようにして画面に表示されたかを考えてみてください。curses を使用する tty ベースのアプリケーションの場合、その行/列に表示される特別なエスケープ シーケンスを使用して stdout に出力されます。したがって、それらの特定のエスケープシーケンスがその位置にあるものを取得することを「期待」してください。

于 2010-01-01T15:03:37.593 に答える