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

时间:2012-10-02 12:28:00

标签: java shell ssh expectj

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

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

    据我所知,我必须使用SHELL或至少保持频道连接。

    我测试了jsch,sshj和ethz.ssh2但结果不好。

    我已经通过stackoverflow回答问题,例如:“发送命令到服务器通过jsch-shell-channel”等。但是他们都专注于在一行中发送整个命令。我需要一个交互式,持久的SSH会话。

    我使用过ExpectJ(有一点输出流)。它已经解决了1,3,4,5点。

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

2 个答案:

答案 0 :(得分:2)

您应该使用ExpectJthe Unix expect utility的Java实现。

答案 1 :(得分:0)

不确定你是否还有问题, 无论如何,它可能会对其他人有所贡献。

ExpectJ确实是Unix期望的Java实现。 你一定要购买“探索期望书”,然后看一下,这是值得的。

对于你的问题: 当您生成进程时,您将侦听返回输出,将其与提示匹配,然后发送一些命令。 如果要分析输出,则缓冲该输出,并在下一个send()

之前执行一些操作

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

以及互动及其运作方式: http://oreilly.com/catalog/expect/chapter/ch03.html 寻找这一部分:“互动命令”