在我的项目下,我有一个 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);
不过,不知道为什么,类文件生成的日志总是显示错误“Host key verification failed. Connection closed.”
我在连接到远程机器的脚本中隔离了那一行,并在本地机器上运行它(存储此类文件和脚本文件的地方),命令成功执行
我手动运行 Java 类文件将执行的命令,它也测试正常:
$ script.sh param1 param2 param3
我试图在互联网上查找错误消息,显然它似乎与 known_hosts 有关。这可能是原因,还是我还缺少其他东西?
非常感谢!
最佳答案
主机 key 在一台机器上验证失败而在另一台机器上验证失败的原因是一台机器之前连接过而另一台机器没有。如果机器之前没有连接到主机,它就没有主机 key 来验证。主机 key 可能由于多种原因而无法验证 - 出于恶意原因,例如有人正在进行中间人攻击,以及出于非恶意原因,例如远程机器的主机名已更改。
修复它的方法是从 ~/.ssh 中的 known_hosts 文件中删除该行
附带说明一下,您知道您不必为 SFTP/SCP 花钱吗? JSch存在并将允许您在 Java 中使用 SFTP/SCP。您可能应该这样做,因为它可以在 Windows 等非 Unix 平台上运行,并且您可以更好地控制诸如 known_hosts 之类的东西。这是pretty easy使用。
关于java - 通过 Java 运行时进程连接到 SFTP 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2986800/