通过Java程序的远程SSH命令

首先我的Linux知识是有限的! 我更像一个开发者,随便pipe理一些服务器:-)

所以,我在一个RHEL5 / 6(混合)服务器的服务器上运行,这里是我想要做的:我在一个主服务器上有一个Java程序,它在一些远程机器上运行命令。 Java程序将我的命令正确地发送到操作系统 – 可以毫无问题地执行本地命令。 我的问题是在远程服务器上执行命令:

  • 我有SSH密钥,它允许我的主人简单地获得奴隶的root权限
  • 我的命令工作,如果我直接通过terminal触发(例如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. 

所以,熟悉谷歌,我已经读了关于应该解决问题的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 + Cing后,我看到了以下文字:

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

所以我假设有些东西在工作,它只是卡在input。 但是,我无法find任何关于这个错误的结论。 其中一个提示是编辑/etc/sudoers并注释掉(我知道这不是推荐的)

 # Defaults requiretty 

虽然我不知道是否应该改变主设备和/或从设备上的设置,并且需要重启或者重启一个守护进程。

我现在的问题是:这是否导致任何地方或我的尝试毫无价值? 还是有更好的方法来运行主机上的程序触发的从站上的远程命令? 请记住,我不会重新编译我的内核或做任何复杂的shenanigan,因为我只是缺乏Linux的经验..

帮助非常感谢!

我有SSH密钥

这些密钥是否在根帐户下设置?

主机密钥validation失败。

主机'192.168.1.1(192.168.1.1)'的真实性无法build立。 RSA密钥指纹是。

您的程序不写出到known_hosts文件。 您尝试连接的主机尚未使用来自java进程正在使用的帐户。 在使用之前,您将需要生成一个有效的known_hosts文件。 或者,如果你是一个有点信任的人,你可以设置StrictHostKeyChecking no选项。

如果在这个帐户下使用过,那么环境就会有些混乱。 您可能需要强烈考虑为ssh客户端设置configuration文件并定义键和known_host文件的path。 让你的java程序使用ssh -f configfile来引用configuration文件。

通过使用Java库Jsch解决了我的问题,这是一个纯Java的SSH2实现。 我想,在我的环境中我的SSH设置也混乱了,所以这在我看来是更有效的select。

花了我1-2个小时让它工作 – 很容易实现。

无论如何感谢您的build议。 我特别需要使用StrictHostKeyChecking=no选项(它也可以在Java库中使用)来连接。

优点和缺点:

  • ( – ) Jsch的文档非常糟糕
  • ( – )有一些假设,你需要弄清楚什么时候你第一次使用它。
  • (+)但是,networking中有很多问题和答案,因为图书馆被很多人使用。
  • (+)这里有一些非常好的示例,它们演示了不同的函数是如何工作的 – 尽pipe这并不能完全替代一个好的文档。