Рубрики
Без рубрики

Jsch – исключение неизвестного хосткея

Чтобы устранить исключение Jsch `Unknownhostkey`, мы можем использовать `ssh-keyscan` для добавления удаленного IP-адреса или имени хоста в файл `known_hosts`.

Этот пример Java пытается использовать Jsch для загрузки файла с удаленного сервера в локальную систему.

  
     com.jcraft
     jsch
     0.1.55
  
package com.mkyong.io.howto;

import com.jcraft.jsch.*;

public class SFTPFileTransfer {

    private static final String REMOTE_HOST = "1.1.1.1";
    private static final String USERNAME = "";
    private static final String PASSWORD = "";
    private static final int REMOTE_PORT = 22;

    public static void main(String[] args) {

        String localFile = "/home/mkyong/local/Test10.txt";
        String remoteFile = "/home/mkyong/remote/Test.txt";

        Session jschSession = null;

        try {

            JSch jsch = new JSch();

            // Why UnknownHostKey?
            jsch.setKnownHosts("/home/mkyong/.ssh/known_hosts");

            jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);

            jschSession.setPassword(PASSWORD);

            jschSession.connect();

            Channel sftp = jschSession.openChannel("sftp");

            sftp.connect();

            ChannelSftp channelSftp = (ChannelSftp) sftp;

            // download file from remote server to local
            channelSftp.get(remoteFile, localFile);

            channelSftp.exit();

        } catch (JSchException | SftpException e) {

            e.printStackTrace();

        } finally {
            if (jschSession != null) {
                jschSession.disconnect();
            }
        }

        System.out.println("Done");
    }

}

Запустите вышеуказанную программу, и она выбросит Неизвестный хост-ключ ?

com.jcraft.jsch.JSchException: UnknownHostKey: 1.1.1.1. RSA key fingerprint is ::::
	at com.jcraft.jsch.Session.checkHost(Session.java:805)
	at com.jcraft.jsch.Session.connect(Session.java:345)
	at com.jcraft.jsch.Session.connect(Session.java:183)
	at com.mkyong.io.howto.SFTPFileTransfer.initJsch(SFTPFileTransfer.java:29)
	at com.mkyong.io.howto.SFTPFileTransfer.uploadFileUsingJsch(SFTPFileTransfer.java:35)
	at com.mkyong.io.howto.SFTPFileTransfer.main(SFTPFileTransfer.java:16)

Решение

Чтобы решить эту проблему, мы можем использовать ssh-keyscan для добавления удаленного IP-адреса или имени хоста в ~/.ssh/known_hosts

ssh-keyscan -t rsa  >> ~/.ssh/known_hosts
ssh-keyscan -t rsa  >> ~/.ssh/known_hosts

Например,

$ ssh-keyscan -t rsa 1.1.1.1 >> ~/.ssh/known_hosts

# 1.1.1.1:22 SSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u7

Рекомендации

Оригинал: “https://mkyong.com/java/jsch-unknownhostkey-exception/”