通过 Java 程序进行远程 SSH 命令

通过 Java 程序进行远程 SSH 命令

首先,我对 Linux 的了解有限!我更像是一名开发人员,偶尔管理一些服务器 :-)

因此,我正在 RHEL5/6(混合)服务器场上操作,我想做的事情如下:我在一台主服务器上有一个 Java 程序,它在某些远程机器上运行命令。Java 程序正确地将我的命令发送到操作系统 - 本地命令可以毫无问题地执行。我的问题是在远程服务器上执行命令:

  • 我有 SSH 密钥,这使我的主服务器能够轻松获得从服务器的 root 权限
  • 如果我直接通过终端触发命令,它就会起作用(例如)ssh [email protected] "cd /opt/bla"
  • 我尝试过不同的方法,得到了不同的结果——没有一个是正确的:)

尝试 #1

$ ssh [email protected]
Pseudo-terminal will not be allocated because stdin is not a terminal.
Host key verification failed.

因此,熟悉 Google 后,我阅读了有关 tty 的信息,它本应解决问题,但只会导致:

尝试#2

$ ssh -t -t [email protected]
tcgetattr: Invalid argument
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is <somehex>.

所以我的应用程序在这一点上卡住了,奇怪的是,在按 Ctrl+C 之后,我看到了以下文本:

Are you sure you want to continue connecting (yes/no)? Killed by signal 2.

所以我假设有些东西在工作,只是卡在输入上。但是,我无法找到有关此错误的任何结论。某处的一个提示是编辑/etc/sudoers并注释掉(我知道不建议这样做)

# Defaults    requiretty

它什么也没做,虽然我不知道是否应该在主服务器和/或从服务器上更改此设置,以及是否需要重新启动或重新启动守护进程。

我现在的问题是:这有什么用吗?还是我的尝试毫无价值?或者有没有更好的方法在主机上的程序触发的从机上运行远程命令?请记住,我不会重新编译我的内核或做任何复杂的恶作剧,因为我缺乏使用 Linux 的经验。

非常感谢您的帮助!

答案1

我有 SSH 密钥

这些密钥是在 root 帐户下设置的吗?

主机密钥验证失败。

无法确认主机“192.168.1.1 (192.168.1.1)”的真实性。RSA 密钥指纹为 。

您的程序未写入 known_hosts 文件。您尝试连接的主机尚未被 Java 进程正在使用的帐户使用。在使用之前,您需要生成一个有效的 known_hosts 文件。或者,如果您是一个比较信任的人,您可以设置该StrictHostKeyChecking no选项。

如果已在该帐户下使用,则环境可能出现问题。您可能需要认真考虑为 ssh 客户端设置配置文件并定义密钥和 known_host 文件的路径。让您的 java 程序使用 引用配置文件ssh -f configfile

答案2

使用 Java 库解决了我的问题杰施,这是 SSH2 的纯 Java 实现。我发​​现,我环境中的 SSH 设置也乱七八糟,所以这对我来说似乎是更有效的替代方案。

我花了 1-2 个小时才让它工作起来——非常容易实现。

无论如何,感谢您的建议。我特别需要使用该StrictHostKeyChecking=no选项(Java 库中也有该选项)才能进行连接。

优点和缺点:

  • (-)Jsch 的文档很糟糕
  • (-)其中有一些假设,您需要在第一次使用时弄清楚。
  • (+)然而,由于该图书馆被很多人使用,因此互联网上存在很多问题和答案。
  • (+)有一些非常好的例子,展示了不同的功能是如何工作的 - 但这并不能完全取代好的文档。

相关内容