Jsch已知主机无法正常工作

时间:2015-07-21 16:53:53

标签: java ssh jsch

好吧,我收到了UnknownHostKey异常。我不想在这篇文章com.jcraft.jsch.JSchException: UnknownHostKey中使用StrictHostKeyChecking = no来解决这个问题。我希望JSCH使用系统的ssh使用的已知主机文件。可能吗?

2 个答案:

答案 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;
        }