java - 期望编程 : How to expect exactly what is prompted?

标签 java linux expect

我特别针对 Java 中的 Expect 实现提出这个问题。但是,我也想知道一般性建议。

在 Expect 编程中,是否可以准确预期在生成新进程后提示的内容?

例如,与其期待某种模式或固定字符串,不如期待提示的内容更好。我觉得这有时真的很有帮助(尤其是在没有条件发送的情况下)。

考虑 sample java code这里使用 JSchExpect4j java 库来执行 ssh 和执行命令列表(ls,pwd,mkdir testdir) 在远程机器上。

我的问题是为什么需要为提示指定模式?难道不可能从 Channel 本身得到准确的提示并期待它吗?

最佳答案

我用“expect”和“java”编程。

我认为您误解了“期望”的基本作用。它不会查找在生成新进程后提示的确切项目。

expect 程序主要包括:

  1. 读取终端的东西
  2. 一组模式(通常是正则表达式),耦合到代码块。

所以,当一个新进程产生时,有一个看起来像这样的循环

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();
     }
  }
}

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

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

关于java - 期望编程 : How to expect exactly what is prompted?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38925913/

相关文章:

java - 为什么他们甚至在被要求之前就持有这么多实例(33)?他们从哪里得到数字 16?

linux - 使用命令行转换 Apache 日志日期时间格式

regex - 不小心尝试正则表达式数组引用并提取了单词 'linux'

linux - 后缀 : which option for multiple domains and multiple users?

linux - 期望脚本在文件中收集输出

linux - 借助 expect 自动登录的 Shell 脚本

java - java中的高效状态机模式

java - 创建名称为 'Individual_Controller' : Injection of autowired dependencies failed; 的 bean 时出错

linux - 我的期望脚本关闭得太快

java - 对象类和数组 - 为什么它返回 'null' ? [java]