我可以使用给定的凭据成功连接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
答案 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);