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

标签 java shell ssh expectj

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

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

这将是一个更大应用程序的插件,所以像“尝试其他东西”(即 RPC、Web 服务)这样的答案对我没有帮助:(

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

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

我已经在 stackoverflow 上找到了诸如“通过 jsch-shell-channel 发送命令到服务器”等问题的答案。但它们都专注于在一行中发送整个命令。我需要一个交互式、持久的 SSH session 。

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

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

最佳答案

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

关于Java 库通过 ssh 在远程服务器上运行多个不相关的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12690248/

相关文章:

java - Conway 生命游戏的多线程 Java 程序 - 边界单元的竞争

ssh - 在 ubuntu 操作系统上设置或重用 ssh key

linux - 在 Mathematica 中运行 ssh 命令

docker - Kubernetes - 通过 ssh 连接到远程数据库服务器

java - 创建自定义身份提供者并使用 keycloak 对其进行配置

java - Android 网络类(class)

java - Wicket 口中的日历

linux - Mono如何删除与正则表达式匹配的文件

linux - Bash 中的 Xargs 并行性

shell - 在 ("{}"中多次使用当前文件名 "find -exec")?