0

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

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

我用过ExpectJ(对输出流做了一点修改)。它已经解决了第 1、3、4、5 点。

但是第 2 点存在问题。在我的应用程序中,我需要得到单独的答案。但我们不会知道它们的长度。命令提示符可以不同。任何人都知道如何“破解”ExpectJ,所以它会更加同步吗?我正在寻找这样的行为:发送,等待完整答案,发送,等待......我尝试了一些基本的同步技巧,但这通常会导致超时和连接丢失。

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

Java 库通过 ssh 在远程服务器上运行多个不相关的命令

4

1 回答 1

1

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

我现在面临着完全相同的问题,因为我需要interact(),所以我现在没有任何其他选择。所以,下面的这个解决方案并不优雅,但可以完成这项工作。太糟糕了,我们没有一个像样的期望 java 实现。我希望我们会在 java 8 中,当(我希望)我们会关闭。

    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]);
    }
于 2013-04-02T12:16:42.553 回答