通过Java Runtime进程连接到SFTP服务

时间:2010-06-07 02:39:39

标签: java sftp runtime.exec

在我的项目中,我有一个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);

但是,我不确定原因,但是类文件生成的日志始终显示错误“主机密钥验证失败。连接已关闭。

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

我手动运行Java类文件将执行的命令,并且它也测试好了:

$ script.sh param1 param2 param3

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

非常感谢!

1 个答案:

答案 0 :(得分:2)

主机密钥无法在一台计算机上验证而不在另一台计算机上验证的原因是因为一台计算机之前已连接而另一台计算机未连接。如果机器之前没有连接到主机,则不会有主机密钥进行验证。主机密钥可能由于多种原因而无法验证 - 出于恶意原因,例如某人正在进行中间人攻击,并且出于非恶意原因,例如远程计算机的主机名已更改。

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

另一方面,您知道您不必为SFTP / SCP支付费用吗? JSch存在,并允许您在Java中使用SFTP / SCP。你应该这样做是因为它可以在像Windows这样的非Unix平台上运行,你可以对known_hosts之类的东西有更多的控制权。使用pretty easy