问题场景:
因项目上需要下载第三方的sftp文件,这里用的是JSch连接的sftp服务器,JSch只需要在pom文件引入即可
<!-- sftp -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
在连接服务器的时候出现如下异常 连接代码如下:
public ChannelSftp connect() {
JSch jSch = new JSch();
Session session = null;
ChannelSftp sftp = null;
try {
jSch.addIdentity("D:\\WorkSoft\\baidu\\file\\key.pem");
session = jSch.getSession(loginName, server, port);
session.connect(3000);
Properties properties = new Properties();
properties.put("StrictHostKeyChecking", "no");
session.setConfig(properties);
sftp = (ChannelSftp) session.openChannel("sftp");
sftp.connect();
logger.info("登录成功:" + sftp.getServerVersion());
} catch (Exception e) {
logger.error("连接sftp服务器发生异常!", e);
return null;
}
return sftp;
}
出现错误的原因是因为我们在使用ssh或者sftp命令第一次连接指定终端的时候会提示你保存一个指纹信息比如输入yes/no , 之后信息会被保存在known_hosts里面(也不一定会在这个文件里面比如我用xshell6先连接一下服务器会在这个文件里面缓存公钥信息,但用xshell7就不会,xshell7会缓存到别的位置),但是在代码里面没法这样操作,需要自己指定known_hosts文件的位置才行。所以代码里加入下面这段话就可以了,我本地的known_hosts文件位置是:C:\Users\lenovo\.ssh\known_hosts 一般known_hosts文件里面需要有这样的内容如下所示:
127.0.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCCkUbYb6F1reUNzAGEd3x7cgWEoJanW0t4xQVgTViUkA1yw3rtU6BuzHdpycn7G4s97M5BsCSHsb/vJliO0//uR9Ls2E9tQWIJNiurectR6j8pe0y/7OCVHvA79IuDYzvHdPBx8Zi+L5CVc0ip9ShCbmEY8FN6lkmpChkwxVNGC4nlKEzCbcxdMnhUw9xKk/VUFAJGC/RMnmzf2uAKmAciTcuRxaLMNEU/Au3XTjUuVwm4SyAHG5Pa3Us6fjVrzgYeThRxcEOymM3oVPqbXNHEwZsE404IDfB6phxkEGqKSjb4B/uEcqhCoQ8BCfXcLDmj6umt8fapiPUDN8eddoXm
自己连接的sftp服务器信息要在known_hosts文件里面有才行否则还是会报错
jSch.setKnownHosts("C:\\Users\\lenovo\\.ssh\\known_hosts");
当然如果不指定known_hosts地址也可以这么写
jSch.setKnownHosts(new FileInputStream("你的文件地址"));
你的文件地址里面内容其实就是缓存的目标主机的公钥信息,没有的话可以自己生成一下即可
|