好吧,我收到了UnknownHostKey异常。我不想在这篇文章com.jcraft.jsch.JSchException: UnknownHostKey中使用StrictHostKeyChecking = no来解决这个问题。我希望JSCH使用系统的ssh使用的已知主机文件。可能吗?
答案 0 :(得分:1)
是的,这是可能的,在建立JSCH连接时,您需要设置knownHosts文件位置:
示例JSCH连接代码:
JSch jsch = new JSch();
jsch.setKnownHosts(propertyReader.getKnownHosts());
session = jsch.getSession(propertyReader.getUsername(),
propertyReader.getSftpLocation(), 22);
session.setPassword(propertyReader.getPassword());
session.connect();
channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftp = (ChannelSftp) channel;
if (!StringUtils.isBlank(fileToPut)) {
sftp.put(fileToPut, propertyReader.getSftpDirectory() + "/"
+ newFileName);
} else {
sftp.put(propertyReader.getSftpDirectory() + "/" + newFileName,
ChannelSftp.OVERWRITE);
}
这里的propertyReader是设置所有sftp物流位置的类 已知的hosts文件将位于运行java程序的用户的〜/ .ssh目录中:
/home/<username>/.ssh/known_hosts
要将远程sftp服务器添加到已知主机文件,您可以首先使用服务器上的常规sftp命令执行手动sftp,您需要使用同一用户运行java进程:
sftp username@host
然后提供密码。或者如果使用密钥:
sftp -i KEYFILE.pem username@host
如果建立连接,它将提示您将主机添加到已知主机,回答是。
将主机注册到已知主机文件后,使用java程序进行连接。
答案 1 :(得分:0)
如前所述,我们必须提供known_hosts文件的完整路径,例如“ / home / <用户名> /。ssh / known_hosts”
在下面的示例中,我们不需要对特定用户的路径进行硬编码。它将使用$ HOME系统变量为当前用户生成文件的位置。
同样,我们必须第一次在服务器上手动发出sftp命令(例如通过Putty),以更新known_hosts文件。
private static ChannelSftp getChannel (String user, String passwd, String host, int port, String IdentityFile, String PassPhrase) throws JSchException
{
// set dbms_java.set_output(1000000); -- in PL/SQL to read messages
System.out.println("user: " + user);
System.out.println("passwd: " + passwd);
System.out.println("host: " + host);
System.out.println("port: " + port);
System.out.println("IdentityFile: " + IdentityFile);
System.out.println("PassPhrase: " + PassPhrase);
// --
JSch jsch = new JSch();
String HOME = String.valueOf(System.getenv("HOME"));
String knownHostsFileName = Paths.get(HOME, ".ssh", "known_hosts").toString();
System.out.println("knownHostsFileName: " + knownHostsFileName);
if (knownHostsFileName != null && new File(knownHostsFileName).exists()) {
jsch.setKnownHosts(knownHostsFileName);
System.out.println("KnownHostsFile added");
}
if (IdentityFile != null && new File(IdentityFile).exists()) {
jsch.addIdentity(IdentityFile, PassPhrase);
System.out.println("IdentitFile added");
}
Session session = jsch.getSession(user, host, port);
System.out.println("jsch.getSession");
session.setPassword(passwd);
System.out.println("setPassword");
/* // It is necessary if we want to turn off known_hosts checking
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
config.put("PreferredAuthentications", "publickey,password");
session.setConfig(config); */
session.connect();
System.out.println("session.connect");
Channel channel = session.openChannel("sftp");
System.out.println("session.openChannel-sftp");
channel.connect();
System.out.println("channel.connect");
return (ChannelSftp) channel;
}