我正在运行一个java程序,我使用Java SFTP将文件从一个文件夹传输到另一个文件夹 . 我遇到的问题是我在Java SFTP中遇到以下错误(使用JSch):
C:\ Oracle \ Middleware \ Oracle_Home \ oracle_common \ jdk \ bin \ javaw.exe -server -classpath C:\ JDeveloper \ mywork \ Java_Hello_World.adf; C:\ JDeveloper \ mywork \ Java_Hello_World \ Client \ classes; C:\ Users \ ADMIN \ Downloads \ _jsch-0.1.53.jar -Djavax.net.ssl.trustStore = C:\ Users \ IBM_AD~1 \ AppData \ Local \ Temp \ trustStore5840796204189742395.jks FileTransfer com.jcraft.jsch.JSchException:UnknownHostKey :127.0.0.1 . RSA密钥指纹是a2:39:3f:44:88:e9:1f:d7:d1:71:f4:85:98:fb:90:dc at com.jcraft.jsch.Session.checkHost(Session.java: 797)at com.jcraft.jsch.Session.connect(Session.java:342)at com.jcraft.jsch.Session.connect(Session.java:183)at FileTransfer.main(FileTransfer.java:33)进程退出时退出代码0 .
以下是我目前的代码:
FileTransfer fileTransfer = new FileTransfer();
JSch jsch = new JSch();
try {
String host = "127.0.0.1";
int port = 22;
String user = "user";
Session session = jsch.getSession(user, host, port);
session = jsch.getSession("username", "127.0.0.1", 22);
session.connect(); // bug here , java.net.ConnectException
ChannelSftp sftp = null;
sftp = (ChannelSftp)session.openChannel("sftp") ; //channel;
//extra config code
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// end extra config code
sftp.rename("C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_1\\house.bmp", "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_2\\house.bmp");
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
} //end-catch
我的Cygwin已经设置好了,我检查了它(正在 netstat -a -b
)它正在运行 .
3 回答
您试图通过将
StrictHostKeyChecking
设置为no
来跳过主机密钥检查 .但是你必须在检查之前,即在
session.connect()
之前这样做 .无论如何,你永远不应该这样做,除非你不关心安全性 . 主机密钥检查是为了保护您免受man-in-the-middle attacks .
相反,设置一个预期的主机密钥让JSch验证它 .
例如:
.ssh/known_hosts
的文件的路径 .要生成类似
.ssh/known_hosts
的文件,可以使用OpenSSH中的ssh-keyscan
命令 . 如果从* nix服务器连接,则应该可以使用该命令,只需运行即可它将具有以下格式:
并在JSch代码中引用生成的
known_hosts
文件 .如果您使用的是Windows,则可以从Win32-OpenSSH project或Git for Windows获取
ssh-keyscan
的Windows版本 .JSch.getHostKeyRepository().add()
以提供预期的主机密钥(例如,硬编码,作为您的其他凭证) .见Creating JSch HostKey instance from a public key in .pub format .
旁白:通过“Cygwin”我假设你的意思是sshd或sftpd,因为Cygwin本身不会做SSH .
无论如何,如果您希望Jsch客户端接受来自主机的任何密钥,请移动设置
StrictHostKeyChecking no
的.setConfig
调用,使其为 beforesession.connect()
. 或者,您必须提供对包含主机正确密钥的商店的访问权限,如@Martin所解释的那样 - 当您连接到"localhost"以外的任何其他设备或者可能是某台机器时,您应该始终这样做,物理安全的网段(例如单个房间内的有线LAN集线器) .jsch版本:0.1.55
我的问题通过运行解决:
**在我的情况下,jsch正在查找known_hosts文件中的ip地址