2017-01-10 18 views
0

Я могу успешно подключиться к WinSCP, используя данные учетные данные, на SFTP-сервере. Но когда это делать из Java с помощью Apache VFS я получаю ошибку:Соединение SFTP с apache vfs выходит из строя, но успешно с WinSCP

Caused by: org.apache.commons.vfs2.FileSystemException: Could not connect to SFTP server at "sftp://username:***@server_addres/". 
at org.apache.commons.vfs2.provider.sftp.SftpClientFactory.createConnection(SftpClientFactory.java:170) 
at org.apache.commons.vfs2.provider.sftp.SftpFileProvider.doCreateFileSystem(SftpFileProvider.java:97) 
... 22 more 
Caused by: com.jcraft.jsch.JSchException: Auth fail 
at com.jcraft.jsch.Session.connect(Session.java:512) 
at com.jcraft.jsch.Session.connect(Session.java:183) 
at org.apache.commons.vfs2.provider.sftp.SftpClientFactory.createConnection(SftpClientFactory.java:166) 

Я проверил полномочия и они точно так же, как и те, когда я пытаюсь соединиться с WinSCP. WinSCP может подключиться успешно, но мой код java получает вышеуказанную ошибку (Auth fail).
Кто-нибудь знает, что может быть проблемой?
Открытый IP-диапазон машины, с которой я соединяюсь, был добавлен в исключения брандмауэра как доверенный IP-адрес с другой стороны.
Пожалуйста, помогите, любые идеи очень ценятся.

С наилучшими пожеланиями,
misamas

+0

Вы можете проверить файл журнала сервера ssdh и посмотреть, с чего он жалуется. Возможно, он хочет другого метода аутентификации или пытается сначала установить некоторые tty или другие настройки. – eckes

ответ

1

Проблема была в пароле. Он содержал знак%, который является специальным символом при передаче в URI (например, pass% word).
Таким образом, решение делает UriParser.encode (sftpUri) перед передачей его manager.resolveFile() метод, как это (для того, чтобы заменить знак% пароля в URI с его шестнадцатеричный код% 25):

import org.apache.commons.vfs2.provider.UriParser; 
... 
String sftpUri = String.format("sftp://%s:%[email protected]%s/%s/%s", configData.getUserId(), configData.getPassword(), configData.getServerAddress(), 
       configData.getRemoteDirectory(), configData.getFileName()); 
String sftpUriEncoded = UriParser.encode(sftpUri); 
FileObject remoteFile = manager.resolveFile(sftpUriEncoded, options);