2009-09-24 61 views
7

我已经继承了一个已有20年历史的交互式命令行unix应用程序,该应用程序不再受其供应商支持。我们需要在这个应用程序中自动执行一些任务。如何通过Perl以编程方式控制交互式Unix应用程序?

其中最麻烦的是创建数千个具有稍微不同参数(例如不同标识符,不同名称)的新记录。记录必须按顺序创建,每次一个,这需要几个月的时间(因此需要花费美元)才能手动完成。在大多数情况下,创建记录具有非常可预测的键入命令,读取响应,键入更多命令等的模式。但是,某些记录创建操作将导致错误条件('此标识符已存在的记录'),这需要一组不同的命令可以优雅地退出。

我可以看到几种不同的方式来做到这一点:

  • 命名管道。编写一个运行目标应用程序的Perl脚本,将STDIN和STDOUT设置为命名管道,然后向目标应用程序发送一系列命令以创建具有所需参数的记录,然后指示目标应用程序退出并关闭。然后我们根据需要用不同的参数多次运行脚本。

  • 申请。查找另一个可用于脚本交互式程序的Unix工具。我唯一能够找到的是expect,但这似乎并不是最重要的;和聊天记录,这些记录我从很久以前就已经记得,而且似乎做的或多或少都是我想要的,但似乎只是用于控制调制解调器。

还有一个潜在并发症:我觉得目标应用程序是为VT100终端编写的,它使用某种形式的转义序列的做一些事情,如提供突出。

我的问题是我应该采取什么方法?其中之一,或者完全不同的东西?我非常喜欢使用命名管道的想法,然后使用Perl脚本打开FIFO并根据需要进行读写操作,因为它提供了很大的灵活性,但是从我读过的内容来看,似乎存在很多潜在的问题我沿着这条路走下去。

在此先感谢。

+1

期望现在在sourceforge http://sourceforge.net/projects/expect/ – Mark 2009-09-24 11:20:52

+0

更新:我有使用Expect.pm的解决方案的材料。感谢所有回复的人。我可以SSH到测试服务器,启动应用程序,并开始与它进行交互。看起来VT100控制代码非常简单。目前我没有帐户,但我已经学会了几个用户名,所以我认为我的第一个真正的自动化测试将是对演示帐户的字典攻击...... – 2009-10-09 07:54:09

回答

12

我一定会坚持Perl的额外的灵活性,因为混乱建议。你知道Expect perl module吗?它比命名管道方法好很多。

还要注意,对于命名管道,您不能强制从旧应用程序返回的输出无缓冲,这可能很烦人。我认为 Expect.pm使用伪ttys来解决这个问题,但我不知道。有关更多详细信息,请参阅perlipc"Bidirectional Communication with Another Process"部分的讨论。

+0

我并不知道Expect Perl模块,所以我给它一个旋风。看起来很有希望,尽管文档有点亮 - 我可能需要阅读最初的期望。 – 2009-10-02 08:01:55

4

expect比你可能会赞扬它更坚实,但如果我是你,我仍然会选择Perl,希望拥有一个完整和熟悉的编程语言来管理流程,并拥有相信无论出现什么奇怪的问题,都会有办法解决它们。

4

预计,无论是与Tcl或Perl implementation s,将是我的第一次尝试。如果你在输出中看到奇数序列,因为它是在做一些奇怪的终端事情,只是在你进行匹配之前从输出中过滤它们。

随着命名管道,你将最终重塑预期。

相关问题