如何通过 Perl 以编程方式控制交互式 Unix 应用程序?

Posted

技术标签:

【中文标题】如何通过 Perl 以编程方式控制交互式 Unix 应用程序?【英文标题】:How can I control an interactive Unix application programmatically through Perl? 【发布时间】:2009-09-24 11:12:41 【问题描述】:

我继承了一个已有 20 年历史的交互式命令行 unix 应用程序,该应用程序不再受到其供应商的支持。我们需要自动化这个应用程序中的一些任务。

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

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

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

应用程序。寻找另一个可用于编写交互式程序脚本的 Unix 工具。我唯一能找到的是expect,但这似乎并没有得到维护;和聊天,我记得很久以前,它似乎或多或少地做了我想要的,但似乎只用于控制调制解调器。

另一个潜在的复杂情况:我认为目标应用程序是为 VT100 终端编写的,它使用某种转义序列来执行诸如提供突出显示之类的操作。

我的问题是我应该采取什么方法?其中之一,还是完全不同的东西?我非常喜欢使用命名管道然后拥有一个 Perl 脚本来打开 FIFO 并根据需要进行读写的想法,因为它提供了很大的灵活性,但从我所读到的内容看来,如果我走这条路。

提前致谢。

【问题讨论】:

expect 现在在 sourceforge sourceforge.net/projects/expect 更新:我已经准备好使用 Expect.pm 的解决方案。感谢所有回复的人。我可以通过 SSH 连接到测试服务器,启动应用程序并开始与之交互。看起来 VT100 的控制代码相当简单。目前我没有帐户,但我已经学会了一些用户名,所以我认为我的第一个真正的自动化测试将是对演示者帐户的字典攻击...... 【参考方案1】:

正如混乱所暗示的那样,我肯定会坚持使用 Perl 以获得额外的灵活性。你知道Expect perl module吗?它比命名管道方法好得多。

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

【讨论】:

我不知道 Expect Perl 模块,所以我试了一下。到目前为止看起来很有希望,但文档有点轻 - 我可能需要阅读原始期望。【参考方案2】:

expect 比您想象的要可靠得多,但如果我是您,我仍然会选择 Perl 选项,希望拥有一种完整且熟悉的编程语言来管理流程和有信心无论出现什么奇怪的问题,都会有解决它们的方法。

【讨论】:

【参考方案3】:

期望,无论是使用 Tcl 还是 Perl implementations,都将是我的第一次尝试。如果您在输出中看到奇怪的序列,因为它正在执行奇怪的终端操作,请在进行匹配之前从输出中过滤掉这些序列。

有了命名管道,你最终还是要重新发明 Expect。

【讨论】:

以上是关于如何通过 Perl 以编程方式控制交互式 Unix 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Perl 基础语法

3-Perl 基础语法

我可以使用 unix utils 以编程方式将 ANSI 控制代码“烧录”到文件中吗?

Perl语言入门

如何在 C# 或 Perl 中以编程方式打开 PowerPoint 演示文稿并将其保存为 HTML/JPEG?

Perl 和 Unix 如何以相同的顺序对 Unicode 字符串进行排序和排序?