【问题标题】:Java library to run multiple unrelated commands on a remote server via sshJava 库通过 ssh 在远程服务器上运行多个不相关的命令
【发布时间】:2012-09-23 07:17:53
【问题描述】:

我的 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,所以它会更加同步吗?我正在寻找这样的行为:发送,等待完整答案,发送,等待... 我尝试了一些基本的同步技巧,但通常会导致超时和连接丢失。

【问题讨论】:

  • SSH library for Java的可能重复
  • 为什么不能每次读取一个命令并执行它,如果没问题就读取下一个命令并执行?
  • 问题是我必须保持会话活跃。主要是指在开始时是其他用户(我不能在此命令中使用 sudo)

标签: java shell ssh expectj


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您应该使用ExpectJ,这是the Unix expect utility 的Java 实现。

    【讨论】:

    • 就我测试它的工作而言。期待J + Jsch。将每个答案分开时有一些问题,但我希望我能解决它(我认为在 ExpectJ 中实现了某种队列,每个“发送”都在其他线程中工作)
    • 在我的应用程序中,我需要得到单独的答案。但我们不会知道它们的长度。命令提示符可以不同。知道如何“破解”ExpectJ,使其更加同步吗?我正在寻找这样的行为:发送,等待完整答案,发送,等待......我尝试了一些基本的同步技巧,但这通常会导致超时和连接丢失。或者可能有一些技巧来检查输出流中是否不会出现新内容?
    • 打开一个新的 StackOverflow 问题,并确保 ExpectJ 在标题中。
    猜你喜欢
    • 2020-10-30
    • 2021-09-04
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多