期待 - 行と列に基づいて画面領域から変数を取得します
-
22-09-2019 - |
質問
I自動相互作用SSHセッションと期待し使用してERPプログラムとしています。
むしろ私のスクリプトを期待内の変数をキャプチャするために正規表現に頼るよりも、それはコード内の変数には、1フィールドを言う、画面領域をキャプチャするために、ユーザからの特定のキーストロークを受信すると、可能でしょうか?サーバーにいくつかの他のコマンドを送信し、フィールドを再送信?
はセイは、注文番号は私の6桁の注文番号を含む6、12、6、18時(6行であり、12〜18列である)を含有します。私は6列12〜18行目から順に番号を取得したい変数にそれをコピーします。そして、その後、別メニューでの注文番号を再送信、ユーザーはいくつかのより多くの(または別のメニューに移動を期待して)対話することができます。
だから私は、私の質問は推測:現在の画面の内容が一つのバッファでいますか? (全体ではなくセッション)あなただけの画面上に、その行と列の範囲で存在することになるだけで、特定のデータ要素を抽出することはできますか?
サンプル擬似コード:
#!/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
}
~~
}
解決
いいえ、あなたは、特定の行/列に画面の外に何かをつかむことはできません。しかし、情報が最初の場所での画面になった方法を考えます。それは呪いを使用してTTYベースのアプリケーションの場合、それは、その行/列に出現させる特殊なエスケープシーケンスとstdoutに出力しました。だから、その位置にあるものを得るためにそれらの特定のエスケープシーケンス「を期待して」ます。
他のヒント
実際には期待が付属しての term_expect のプログラム例は、まさにこれを行うことができます。これは、カーソルのアドレス指定の端末をエミュレートしますが、特定の画面位置でテスト出力することができます。私たActiveTclディストリビューションでは、デモ/期待/ term_expectでいます。
私は、出力の文字を取得するために 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
そして、私は$注文番号変数に格納されていることと、私は前終端文字列への単なる文字何とか隔離する必要があると、変数のものを格納します。