我问这个问题特别针对Expect
中的Java
实施问题。不过,我想知道一般性的建议。
在Expect编程中,是否可以准确预期在生成新流程后会提示什么?
例如,不是期待某些模式或固定字符串,而是仅仅期望提示的内容并不是更好。我觉得这应该是非常有用的(特别是当没有条件发送时)。
考虑sample java code这里使用JSch
和Expect4j
java库来执行ssh并执行命令列表(ls
,pwd
,{{1在远程机器上。
我的问题是为什么有必要为提示指定一个模式?它是否有可能从mkdir testdir
本身获得确切的提示并期望它?
答案 0 :(得分:0)
我编写了“expect”和“java”。
我认为你误解了“期望”基本上是什么。在生成新流程后,它不会查找提示的确切项目。
期望计划基本上包括:
因此,当一个新进程产生时,就会出现一个看起来像这样的循环
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),但除此之外,您可以随时发送命令,无论是否等待任何事情。