我的 Java 应用程序必须像这样工作:
- 用户在 GUI 中选择 bash 命令并按“发送”。
- 应用程序为每个命令返回不同且独立的答案(例如,我们可以将它们存储在不同的文件中)。
- 每个命令都以交互方式运行,而不是批量运行(不能是“ls\n pwd\n”等)
- 在执行每个命令后,应用程序将检查结果是否正常。如果是,它将发送下一个命令。
- 我们需要执行
su <user>
在远程主机上。
这将是一个更大应用程序的插件,所以像“尝试其他东西”(即 RPC、Web 服务)这样的答案对我没有帮助:(
据我了解,我必须使用 SHELL 或至少保持 channel 连接。
我测试了 jsch 、 sshj 和 ethz.ssh2 但结果不好。
我已经在 stackoverflow 上找到了诸如“通过 jsch-shell-channel 发送命令到服务器”等问题的答案。但它们都专注于在一行中发送整个命令。我需要一个交互式、持久的 SSH session 。
我使用过 ExpectJ (对输出流进行了一些修改)。它已经解决了第 1、3、4、5 点。
但是第 2 点存在问题。在我的应用程序中,我需要获得单独的答案。但我们不会知道它们的长度。命令提示符可能不同。任何人都知道如何“破解” ExpectJ 以便它会更加同步?我正在寻找这样的行为:发送,等待完整答案,发送,等待...我已经尝试了一些基本的同步技巧,但这通常会导致超时和连接丢失。
最佳答案
您应该使用ExpectJ , the Unix expect
utility 的 Java 实现.
关于Java 库通过 ssh 在远程服务器上运行多个不相关的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12690248/