【问题标题】:Jsch Known Hosts not workingJsch 已知主机不工作
【发布时间】:2020-07-17 05:55:25
【问题描述】:

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

【问题讨论】:

    标签: java ssh jsch


    【解决方案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 服务器添加到已知的 hosts 文件,您可以先在需要使用同一用户运行 java 进程的服务器上使用常规 sftp 命令执行手动 sftp:

    sftp username@host
    

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

    sftp -i KEYFILE.pem username@host
    

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

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

    【讨论】:

      【解决方案2】:

      在下面找到另一种方法来提供 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;
              }
      

      【讨论】:

      • 欢迎来到 SO!请花一些额外的时间来解释您的答案以及它如何帮助 OP。 (我不是对您的问题投反对票的人,我只是想帮助您改进以避免投反对票:D)
      • 嘿,@GabrielOshiro 看看这个!随意重新投票,伙计。
      猜你喜欢
      • 2014-12-20
      • 1970-01-01
      • 2021-09-21
      • 2012-10-10
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多