3

在我的项目下,我有一个 Java 类文件,其中有一个执行以下外部 SFTP 脚本文件的例程:

#!/bin/sh
echo "cd AV/OASIS" >> sftp
echo "put $1 $2" >> sftp
echo "get AV/OASIS/$2 $3$2" >> sftp
echo "bye" >> sftp
/usr/local/bin/sftp -b sftp id@domain
cat /dev/null > sftp
exit 0

执行脚本文件的 Java 代码如下:

String script = "full path of script";
Process p = Runtime.getRuntime().exec(script + " " + param1 + " " + param2 + " " + param3);

但是不知道为什么,class文件生成的日志总是显示错误“主机密钥验证失败。连接关闭。

我在连接到远程机器的脚本中隔离了该行,并在本地机器上运行它(存储此类文件和脚本文件的地方),命令执行成功

我会手动运行 Java 类文件将执行的命令,它也测试正常:

$ script.sh param1 param2 param3

我试图在 Internet 上查找错误消息,显然它似乎与 known_hosts 有关。这可能是原因,还是我还缺少其他东西?

非常感谢!

4

1 回答 1

2

主机密钥无法在一台机器上验证而不在另一台机器上验证的原因是因为一台机器之前已经连接而另一台机器没有。如果机器之前没有连接到主机,它就没有主机密钥来验证。主机密钥可能由于多种原因无法验证 - 出于恶意原因,例如有人参与中间人攻击,以及出于非恶意原因,例如远程计算机的主机名已更改。

修复它的方法是从 ~/.ssh 中的 known_hosts 文件中删除该行

顺便说一句,您知道您不必为 SFTP/SCP 支付费用吗?JSch存在并将让您在 Java 中使用 SFTP/SCP。您可能应该这样做,因为它可以在 Windows 等非 Unix 平台上运行,并且您可以对 known_hosts 等内容进行更多控制。它 容易使用。

于 2010-06-07T02:57:28.457 回答