/ / SFTP-Verbindung mit Apache-VFS schlägt fehl, ist jedoch mit WinSCP erfolgreich - Sftp, Apache-Commons-VFS

SFTP-Verbindung mit Apache VFS schlägt fehl, ist aber erfolgreich mit WinSCP - sftp, Apache-Commons-VFS

Ich kann erfolgreich eine Verbindung mit WinSCP mit den angegebenen Anmeldeinformationen zum SFTP-Server herstellen. Wenn ich es von Java aus mit Apache VFS mache, bekomme ich eine Fehlermeldung:

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)

Ich habe die Anmeldeinformationen geprüft und sie sind genau die gleichen wie beim Versuch, eine Verbindung mit WinSCP herzustellen. WinSCP kann erfolgreich eine Verbindung herstellen, aber mein Java-Code weist den obigen Fehler auf (Auth Fail).
Hat jemand eine Ahnung, was das Problem sein könnte?
Der öffentliche IP-Bereich des Computers, von dem aus ich mich verbinde, wurde den Firewall-Ausnahmen als vertrauenswürdige IP-Adresse auf der anderen Seite hinzugefügt.
Bitte helfen Sie, alle Ideen werden sehr geschätzt.

Mit freundlichen Grüßen,
Misamas

Antworten:

1 für die Antwort № 1

Das Problem lag im Passwort. Es enthielt ein% -Zeichen, das ein Sonderzeichen ist, wenn es in URI übergeben wird (wie Pass% Word).
Die Lösung bestand also aus UriParser.encode (sftpUri), bevor sie an die manager.resolveFile () -Methode wie folgt übergeben wurde (um das% -Zeichen des Passworts in der URI mit seinem Hex-Code% 25 zu ersetzen):

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);