使用JSch访问Sftp有时候会报异常:reject HostKey,有两种方式可以解决该异常。
1.创建实现com.jcraft.jsch.UserInfo的实体类,且该实体类必须存在一个public型无参构造函数;
2.设置强制HostKey检查为no。
实现com.jcraft.jsch.UserInfo的实体类:
/**
*
*/
package sftp;
import com.jcraft.jsch.UserInfo;
/**
* @author lxzqz
*
*/
public class SFtpUserInfo implements UserInfo {
/**
* 构造函数,此构造函数不可少
*/
public SFtpUserInfo() {
}
public String getPassword() {
return null;
}
public boolean promptPassword(String arg0) {
return false;
}
public boolean promptPassphrase(String arg0) {
return false;
}
public boolean promptYesNo(String arg0) {
return true;
}
public void showMessage(String arg0) {
}
@Override
public String getPassphrase() {
return null;
}
}
使用第一种方式连接Sftp和使用第二种方式连接Sftp的代码如下:
package sftp;
import java.util.Properties;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class Sftp {
public static void sftpUserInfo() throws Exception{
JSch js = new JSch();
//sftp用户名、ip、端口
Session session = js.getSession("test", "172.16.2.183", 10086);
//sftp密码
session.setPassword("test");
//创建一个用户
session.setUserInfo(new SFtpUserInfo());
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp cmd = (ChannelSftp)channel;
//cmd各种命令操作sftp
//释放资源
channel.disconnect();
session.disconnect();
}
public static void strictHostKeyChecking() throws Exception{
JSch js = new JSch();
//sftp用户名、ip、端口
Session session = js.getSession("test", "172.16.2.183", 10086);
//sftp密码
session.setPassword("test");
//设置强制HostKey检查为no
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp cmd = (ChannelSftp)channel;
//cmd各种命令操作sftp
//释放资源
channel.disconnect();
session.disconnect();
}
}