在我们公司,我们出于某种原因使用Jython。我需要用ExpectJ扩展它,但我无法弄清楚如何做到这一点。
我设法下载 expectj-2.0.7.jar , expectj-2.0.7-sources.jar 和 expectj-2.0.7-javadoc .jar 文件,并使它们也可以被Jython和Java本身访问。
所以我可以在我的python脚本中导入它,JVM也可以找到jars(使用classpath loader hack)。但根据ExpectJ's docs,有些事情仍然是错误的。
import expectj
ex = expectj.ExpectJ() # I cannot use the second form of the
# constructor where I can pass a timeout
# parameter
sh = ex.spawn(targetshell, 22, usr, passw) # There is no spawn method in
# ExpectJ - but why???
这是我陷入困境的地方。为什么ExpectJ对象没有spawn
方法?有人有解决方案吗?
答案 0 :(得分:1)
以下解决方案是确保在执行下一个命令之前生成的进程完成。它保证循环'发送 - 期望 - 等待发送'中发送的命令的完成'然后'再次发送 - 再次预期 - 等待完成'。
为了等待命令提示符完成执行生成的进程,请使用shell.expect("")
。如果在此之后还有进一步的expectJ send和expect命令,则可以确保顺序执行。如果没有shell.expect("")
,则执行下一步shell.send("exit\n")
而不等待它已经生成的进程的完成,在下面的情况下,scp命令在下一个命令发出之前完成。< / p>
import expectj
expectinator = expectj.ExpectJ();
shell = expectinator.spawn(expectj.SshSpawn(host_name, 22, usr_name, ssh_pwd));
shell.send("scp -r src:usr:dest" + "\r")
shell.expect(remote_box_usr + "'s password:");
shell.send(ssh_pwd + "\r");
shell.expect("");
shell.send("exit\n");
shell.expectClose();