JSCH: SFTP. Висит на сессии.подключение () через порт 21


Я подключаюсь к FTP-серверу через sftp (JSCH).

Каждый раз, когда я подключаюсь к FTP-серверу через порт 21, он всегда зависает во время сеанса.связываться().

Он не создает никаких исключений. Но когда я использую другие порты. Он работает и выбрасывает исключение.

Есть ли способ, которым я мог бы поймать ошибку?

Вот пример моего кода.

public static void main(String[] args) throws SftpException {

    JSch jsch = new JSch();

    try {

        Session session = jsch.getSession("username", "host", 21);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword("password");
        session.connect();

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp channelSftp = (ChannelSftp) channel;
        session.disconnect();
        channelSftp.disconnect();

    } catch (JSchException e) {
        log("Cannot make connection to FTP server ");
        e.printStackTrace();

    }

}
4 5

4 ответа:

Может ли быть так, что порт 22 является портом по умолчанию для SFTP? И FTP-сервер, работающий на Порту 21, не будет знать, как вести переговоры по безопасному FTP. В основном SFTP-это FTP через SSH.

Отредактировано: Проблема в том, что он бесконечно ждет завершения переговоров. Это мексиканское противостояние, в котором ни одна из сторон не сдается. Вызовите session.setTimeout() перед session.connect(), или вызовите session.connect(timeout), с некоторым подходящим значением (3-5 секунд). Я думаю, что тайм-аут составляет миллисекунды.

У меня была аналогичная проблема, но с правильным портом. сессия.connect() просто зависает и ничего не возвращает. В то время как другие программы могут успешно подключиться.

Причина заключалась в том, что хост предоставляет больше методов аутентификации, и мы должны указать Jsch, чтобы использовать только пароль.

        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        config.put("PreferredAuthentications", "password");
        session.setConfig(config);

Мы запускаем JSch с сервера webMethods. После обновления до новой версии, когда мы попытались подключиться к одному из наших партнеров, он зависает на шаге подключения.

Предложенное здесь решение не работает. Я получил эту ошибку:

Ком.jcraft.jsch.JSchException: Auth fail

Я заметил, что сервер, к которому мы пытаемся подключиться, запрашивает пользователя и пароль перед подключением:

[sagtest@indigo sftpTest]$ /opt/sag/95/sitcore/jvm/jvm/bin/java -jar     
SftpConnect.jar
Password has been set
Timeout has been set
Kerberos username [sagtest]:
Kerberos password for sagtest:
Connected
Channel opened
Connected
Session: iui-bpjobs01.itservices.lan:22:bp-xfer-int:1738666864

Пользователь Kerberos и пароль не должны быть там на все.

После небольшого расследования я нашел эту страницу.: пропуск запросов проверки подлинности Kerberos с помощью JSch

После установки PreferredAuthentications на другие значения-все работает нормально. Код, который я добавил:

session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");

Вот полный пример, который у меня есть - возможно, это поможет кому-то отладить вашу проблему:

public static void main (String[] args){
    String serverport = "22";
    String serverhost = "XXXX";
    String username = "YYYY";
    String password = "ZZZZZ";
    int timeout = 5000;
    try{
      int port = 22;
        String sessionkey = null; 
        if(serverport != null && !serverport.trim().equals(""))
            port = Integer.parseInt(serverport);
        JSch jsch=new JSch();

        Session session=jsch.getSession(username, serverhost, port);
        jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");

        session.setPassword(password);
        System.out.println("Password has been set");
        if(timeout > 0){
            session.setTimeout(timeout);
            System.out.println("Timeout has been set");
        }
        session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
        System.out.println("Added PreferredAuthentications");
        session.connect();
        System.out.println("Connected");

        Channel channel = session.openChannel("sftp");
        System.out.println("Channel opened");
        channel.connect();
        System.out.println("Connected");
        if (channel.isConnected()){
            sessionkey = serverhost  + ":" + serverport + ":" + username + ":" + Thread.currentThread().hashCode();
        } 
        System.out.println("Session: "+sessionkey);
    }catch(Exception e){
        e.printStackTrace();
    }
}

В моем случае, только обновление JSch до последней версии (в настоящее время 1.50) исправило проблему, кажется, была несовместимость в key / auth handshake с более старыми версиями JSch в сочетании с последней OpenSSH версии 7.1.x