我特别针对 Java
中的 Expect
实现提出这个问题。但是,我也想知道一般性建议。
在 Expect 编程中,是否可以准确预期在生成新进程后提示的内容?
例如,与其期待某种模式或固定字符串,不如期待提示的内容更好。我觉得这有时真的很有帮助(尤其是在没有条件发送的情况下)。
考虑 sample java code这里使用 JSch
和 Expect4j
java 库来执行 ssh 和执行命令列表(ls
,pwd
,mkdir testdir
) 在远程机器上。
我的问题是为什么需要为提示指定模式?难道不可能从 Channel
本身得到准确的提示并期待它吗?
最佳答案
我用“expect”和“java”编程。
我认为您误解了“期望”的基本作用。它不会查找在生成新进程后提示的确切项目。
expect 程序主要包括:
- 读取终端的东西
- 一组模式(通常是正则表达式),耦合到代码块。
所以,当一个新进程产生时,有一个看起来像这样的循环
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/