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