期待编程:如何准确地期待提示?

时间:2016-08-12 20:21:36

标签: java linux expect

我问这个问题特别针对Expect中的Java实施问题。不过,我想知道一般性的建议。

在Expect编程中,是否可以准确预期在生成新流程后会提示什么?

例如,不是期待某些模式或固定字符串,而是仅仅期望提示的内容并不是更好。我觉得这应该是非常有用的(特别是当没有条件发送时)。

考虑sample java code这里使用JSchExpect4j java库来执行ssh并执行命令列表(lspwd,{{1在远程机器上。

我的问题是为什么有必要为提示指定一个模式?它是否有可能从mkdir testdir本身获得确切的提示并期望它?

2 个答案:

答案 0 :(得分:0)

我编写了“expect”和“java”。

我认为你误解了“期望”基本上是什么。在生成新流程后,它不会查找提示的确切项目。

期望计划基本上包括:

  1. 读取终端的东西
  2. 一组模式(通常是正则表达式),耦合到代码块。
  3. 因此,当一个新进程产生时,就会出现一个看起来像这样的循环

    while (terminal.hasMoreText()) {
      buffered_text += terminal.readInput();
      for (Pattern pattern : patterns) {
         if (pattern.matches(buffered_text)) {
            String match = pattern.getMatch(buffered_text);
            bufferedText.removeAllTextBefore(match);
            bufferedText.removeText(match);
            pattern.executeBlock();
         }
      }
    }
    

    当然,这是一个大规模的概括。但它足以说明在启动流程后期望自己并不“完全期望”任何东西。提供给期望解释器的程序(主要由模式和模式匹配时执行的代码块组成)包含解释器循环将用于匹配进程输出的项目。

    这就是为什么你会看到一些奇怪的期望脚本。例如,几乎每个人都“期望”“ogin:”而不是“Login:”,因为登录提示是大写还是小写几乎没有一致性。

答案 1 :(得分:0)

你不必期待任何事情。你可以随意立即发送命令。

仅仅回复特定的提示才是好的做法,这样你就不会在错误的时间通过说错话来意外毁掉某些东西,但你可以完全自由地忽略这一点。

主要考虑因素是您的正常流量可能是:

$ create-backup
$ mkdir latest
$ mv backup.tar.gz latest

没有期望,只是盲目地写输入,你最终可以得到这个:

$ create-backup
Disk full, cleanup started...
Largest file: precious-family-memories.tar (510MB)
 [R]emove, [S]ave, [A]bort
Invalid input: m
Invalid input: k
Invalid input: d
Invalid input: i
Removing file...
$  latest
latest: command not found
$ mv backup.tar.gz latest

而在继续之前期望$的程序只会等待并最终意识到事情不会按计划进行。

一些命令对时间敏感(例如telnet),但除此之外,您可以随时发送命令,无论是否等待任何事情。