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 ответа:
Может ли быть так, что порт 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(); } }