【问题标题】:Executing commands over SSH using Java Spring使用 Java Spring 通过 SSH 执行命令
【发布时间】:2016-06-29 12:07:25
【问题描述】:

我和一位同事正在开发一个 Web 应用程序来控制计算机集群。该计算机集群缺少 API,因此我们需要能够使用 Linux shell 通过 bash 脚本控制和添加“作业”。每个用户都有特定的时间在集群上运行应用程序,因此我们需要能够使用用户凭据通过 SSH 连接到系统,以便他们的用户帐户用于提交作业。

Web 应用程序是使用 Spring 编写的。我们已经对使用 Java 通过 SSH 执行命令进行了一些研究,并找到了 Jcsh 模块。然而,我们的问题是是否有一个 Spring 模块可以做到这一点。我们很惊讶我们找不到一个,因为 SFTP 模块已经存在并且(如果我错了,请纠正我)使用相同的协议。

我们是否误读了文档,或者没有模块可以做到这一点?

非常感谢!

【问题讨论】:

标签: java spring ssh spring-boot


【解决方案1】:

我真的不认为 Spring 直接调用 SSH 是个好主意。

因为如果您想直接调用 SSH,您需要将主机密码存储到您的应用程序中,或者将私钥存储在您的应用程序中(也许这样更好,因为您可以使用 Java 的密钥库来保护您的私钥)

无论哪种方式,您都将让应用程序能够执行主机允许的任何操作(并且由于您可以通过运行命令来控制主机的应用程序,因此我认为这种使用具有很大的功能)。

这对计算机集群来说可能是相当危险的。

如果你确实需要通过SSH调用函数,我建议你写一个小的原生应用程序(使用python或Java,任何你喜欢的),并设置你的应用程序的权限只能执行这个应用程序,这样更安全.

所以,在 Spring 中支持 SFTP 是明智的,因为这是一种非常有用的数据传输方式,但是让您的应用程序可以直接运行 SSH 非常非常非常危险,即使是在家里,相信我。

【讨论】:

  • 感谢您的回复。安全性是我们的主要问题之一,因为确实从 Web 运行计算机集群会引发一些问题。这就是为什么我们不存储密码和/或密钥,并且每次用户想要使用集群时我们都会询问他们的凭据。集群通过提交 bash 脚本运行,所以我真的认为除了 ssh 连接之外别无他法。编辑:ssh 连接不会经常打开,但是当需要运行命令时,我们会使用每个用户的凭据建立一个新连接。
  • 所以,我建议你创建一个小的python(bash或其他应用程序,并提供api),例如cluster add_user death_pool -u root -p the_passwordcluster grant_user death_pool sucker -u root -p the_password然后你可以使用你的Java应用程序调用这个应用程序通过 Java 进程而不是直接使用 SSH。这要好得多(如果需要,您可以在应用程序中汇集 SSH 连接),并且在某些方面比使用 SSH 连接更快。出于集成的目的,Spring 将支持任何数据端点,SSH 不是数据端点。
【解决方案2】:

Jsch 确实是目前最好的 Java SSH 实现。

遗憾的是,Spring 不提供与它的任何集成。我个人不得不编写自定义管道来使用它。这是一个低级 API,但该项目是很好的文档,有很好的例子。

对于之前的项目,我为 Jsch 编写了一个类似于 API 包装器的模板。遗憾的是我无法开源它。

【讨论】:

  • 感谢您的回答!遗憾的是它不可用,我想我们必须自己编写:(