首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以同步的方式使用ExpectJ (等待未知内容的答案)?

如何以同步的方式使用ExpectJ (等待未知内容的答案)?
EN

Stack Overflow用户
提问于 2012-10-15 10:54:19
回答 1查看 993关注 0票数 0

我的Java应用程序必须像这样工作:

  • 用户在GUI中选择bash命令,然后按下“send”。
  • 应用程序为每个命令返回不同和独立的答案(例如,我们可以将它们存储在不同的文件中)。
  • 命令以交互方式运行,而不是在批处理中运行(不可能是"ls\n pwd \n“之类的命令)
  • 在每个命令之后,应用程序将等待并检查结果是否正常。如果是这样,它将发送下一个命令。
  • 我们需要在远程主机上执行su。

我使用了ExpectJ (附带一些输出流)。它解决了第1、3、4、5点。

但是第2点有一个问题,在我的应用程序中,我需要得到分开的答案。但我们不知道它们的长度。命令提示可以是不同的。任何人都知道如何“黑”ExpectJ,这样就会有更多的同步吗?我在寻找这样的行为:发送,等待完整的回答,发送,等待.我已经尝试过一些基本的同步技巧,但这以超时和通常丢失的连接结束。

这个问题与我的老问题有关:

Java library to run multiple unrelated commands on a remote server via ssh

EN

回答 1

Stack Overflow用户

发布于 2013-04-02 12:16:42

问题基本上是期望j同时发送和侦听,在单独的线程中缓冲输入和输出,因此您必须知道响应何时结束,以便可以分隔每个请求/响应块。如果您不关心expect“交互”模式,您可以尝试破解expect4J、expect4J (https://github.com/ronniedong/Expect-for-Java)甚至apache。

我现在正面临着完全相同的问题,而且由于我需要交互(),我现在没有任何其他选择。因此,下面这个解决方案并不优雅,但可能会完成这项工作。不幸的是,我们没有一个体面的expect java实现。我希望我们将在java 8,当(我希望)我们将有结束。

代码语言:javascript
复制
    ExpectJ ex = new ExpectJ(50);
    Spawn spawn = ex.spawn(new SshSpawn("192.168.56.101", 22, "alice", "password"));
    String command = "hostname -s;expr 123456788 + 1";
    spawn.send(command+"\n");
    spawn.expect("123456789");
    String lsResults = spawn.getCurrentStandardOutContents().split("123456788 \\+ 1\r\n")[2].split("123456789")[0];
    String[] lsRows = lsResults.split("\r\n");
    for(int i=0;i<lsRows.length;i++){
        System.out.println(i+":"+lsRows[i]);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12894113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档