Jsch 已知主机不工作

Jsch Known Hosts not working

好的,我收到 UnknownHostKey 异常。我不想像 post com.jcraft.jsch.JSchException: UnknownHostKey 那样使用 StrictHostKeyChecking=no 来解决问题。我希望 JSCH 使用系统 ssh 使用的已知主机文件。可能吗?

是的,这是可能的,在建立 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是class设置所有sftp物流的位置 已知主机文件将位于用户的 ~/.ssh 目录内,java 程序与之 运行ning :

/home/<username>/.ssh/known_hosts

要将远程 sftp 服务器添加到已知主机文件,您可以先在服务器上使用常规 sftp 命令执行手动 sftp,您需要使用 运行 java 进程同一用户:

sftp username@host

然后提供密码。或者如果使用密钥:

sftp -i KEYFILE.pem username@host

如果建立连接,它会提示您将主机添加到已知主机中,回答是。

将主机注册到已知hosts文件后,使用java程序连接。

在下面找到另一种方法来提供 known_hosts 文件的完整路径

如前所述,我们必须提供 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;
        }