与apache vfs的SFTP连接失败,但使用WinSCP成功

时间:2017-01-10 09:10:52

标签: sftp apache-commons-vfs

我可以使用给定的凭据成功连接WinSCP到SFTP服务器。但是当使用apache vfs从java进行时我得到错误:

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失败) 有没有人知道可能是什么问题?
我连接的机器的公共IP范围已被添加到防火墙例外,作为另一方的可信IP 请帮助,非常感谢任何想法。

亲切的问候,
misamas

1 个答案:

答案 0 :(得分:2)

问题在于密码。它包含%符号,这是在URI中传递时的特殊字符(如传递%word) 所以解决方案是在将UriParser.encode(sftpUri)传递给这样的manager.resolveFile()方法之前(为了将URI中的密码的%符号替换为其十六进制代码%25):

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