3

我正在使用 Expect 与 SSH 会话和 ERP 程序进行自动交互。

与其依靠正则表达式来捕获我的期望脚本中的变量,是否有可能在接收到用户的某个击键后将屏幕区域(例如一个字段)捕获到代码中的变量中?向服务器发送一些其他命令并重新发送该字段?

假设订单号包含在 6、12、6、18(其中 6 是行,12-18 是列)包含我的 6 位订单号。我想从第 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

                }
                ~~
        }
4

3 回答 3

1

实际上,Expect 附带的term_expect示例程序可以做到这一点。它模拟一个光标可寻址终端,并允许您在特定屏幕位置测试输出。在我的 ActiveTcl 发行版中,它位于 demos/Expect/term_expect 中。

于 2010-01-07T11:23:48.577 回答
0

不,您不能在特定的行/列从屏幕上抓取一些东西。但是,首先要考虑一下这些信息是如何出现在屏幕上的。如果它是一个使用 curses 的基于 tty 的应用程序,它会使用特殊的转义序列输出到标准输出,导致它出现在该行/列中。因此,“期望”那些特定的转义序列来获得该位置的内容。

于 2010-01-01T15:03:37.593 回答
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 回答