2

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

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

这将是一个更大应用程序的插件,因此“尝试其他”(即 RPC、Web 服务)之类的答案对我没有帮助:(

据我了解,我必须使用 SHELL 或至少保持通道连接。

我已经测试过 jsch 、 sshj 和 ethz.ssh2 但结果很糟糕。

我已经通过stackoverflow对以下问题的答案进行了挖掘:“sending-commands-to-server-via-jsch-shell-channel”等。但它们都专注于在一行中发送整个命令。我需要一个交互式的、持久的 SSH 会话。

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

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

4

2 回答 2

2

您应该使用ExpectJ ,它是Unixexpect实用程序的Java 实现。

于 2012-10-02T13:51:43.773 回答
0

不确定您是否还有问题,无论如何,它可能会影响其他人。

ExpectJ 确实是 Unix expect 的 Java 实现。你绝对应该买“探索期望书”然后看看它,这是值得的。

对于您的问题:当您生成一个进程时,您会听取返回输出,将其与提示匹配,然后发送一些命令。如果要分析输出,请缓冲该输出,并在下一次 send() 之前执行一些操作

为此,您需要使用您使用的 spawn 类的 interact() 方法。 http://expectj.sourceforge.net/apidocs/index.html

以及交互及其工作原理:http: //oreilly.com/catalog/expect/chapter/ch03.html 查找这部分:“交互命令”

于 2013-05-07T16:13:07.903 回答