我与SSH会话,并使用期望的ERP程序自动交互。

不是依赖于正则表达式来捕获在我的expect脚本变量有可能在从用户接收一键击一定的捕捉的屏幕区域,比方说一个字段,到代码中的变量?向服务器发送的其他一些命令并重新发送字段?

说,一个顺序号包含在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

                }
                ~~
        }
有帮助吗?

解决方案

没有,你不能抢东西了屏幕在特定的行/列。然而,想想信息摆在首位是怎么到屏幕上。如果是使用诅咒一个基于tty的应用是输出与导致它出现在该行/列特殊的转义序列标准输出。因此,“预计”这些具体的转义序列得到的是在该位置。

其他提示

实际上的 term_expect 示例附带期望程序可以做的正是这一点。它模拟光标寻址端子,并允许您测试输出在特定的屏幕位置。在我的ActiveTcl分配它在演示/期待/ term_expect。

我的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变量,我需要以某种方式分离只是终止串之前和存储那些在一个变量中的字符。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top