【问题标题】:org.apache.commons.vfs.FileSystemException: Could not connect to SFTP server at "sftp://username:***@114.XX.XX.XX/" on port 21org.apache.commons.vfs.FileSystemException:无法在端口 21 上的“sftp://username:***@114.XX.XX.XX/”连接到 SFTP 服务器
【发布时间】:2019-11-08 02:09:03
【问题描述】:

我可以使用以下凭据从 WinSCP 访问 SFTP

  • serverAddress=114.XX.XX.XX
  • userId=orafusion
  • 密码=OraP!ss!123
  • remoteDirectory=TestData/
  • 端口=21

使用的库:

  • commons-vfs2-2.0.jar
  • jsch-0.1.50.jar

尝试使用 Java 以编程方式连接时出现以下错误。当我浏览谷歌的错误时,我能得到的只是特殊字符!用于密码。因此使用UriParser.encode(sftpuri) 可以解决问题,但不幸的是它没有帮助。

org.apache.commons.vfs.FileSystemException: Could not connect to SFTP server at "sftp://orafusion:***@114.XX.XX.XX/".
    at org.apache.commons.vfs.provider.sftp.SftpFileProvider.doCreateFileSystem(SftpFileProvider.java:99)
    at org.apache.commons.vfs.provider.AbstractOriginatingFileProvider.getFileSystem(AbstractOriginatingFileProvider.java:103)
    at org.apache.commons.vfs.provider.AbstractOriginatingFileProvider.findFile(AbstractOriginatingFileProvider.java:82)
    at org.apache.commons.vfs.provider.AbstractOriginatingFileProvider.findFile(AbstractOriginatingFileProvider.java:66)
    at org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:692)
    at org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:620)
    at com.gfi.oracle.penalty.view.bean.GetMyFiles.startFTP(GetMyFiles.java:76)
    at com.gfi.oracle.penalty.view.bean.GetMyFiles.main(GetMyFiles.java:38)

Caused by: org.apache.commons.vfs.FileSystemException: Could not connect to SFTP server at "114.XX.XX.XX".
    at org.apache.commons.vfs.provider.sftp.SftpClientFactory.createConnection(SftpClientFactory.java:214)
    at org.apache.commons.vfs.provider.sftp.SftpFileProvider.doCreateFileSystem(SftpFileProvider.java:90)
    ... 7 more

Caused by: com.jcraft.jsch.JSchException: Session.connect: java.net.SocketTimeoutException: Read timed out
    at com.jcraft.jsch.Session.connect(Session.java:495)
    at com.jcraft.jsch.Session.connect(Session.java:150)
    at org.apache.commons.vfs.provider.sftp.SftpClientFactory.createConnection(SftpClientFactory.java:210)
    ... 8 more

以下是我用于从 SFTP 下载文件的代码。

博客参考:https://www.mysamplecode.com/2013/06/sftp-apache-commons-file-download.html

UriParser.encode(sftpUri) 的输出。我可以推断这里没有附加端口

sftp://orafusion:OraP!ss!123@114.XX.XX.XX/TestData/TestFile.txt

下面的代码行出错了

FileObject remoteFile = manager.resolveFile(UriParser.encode(sftpUri), opts);

props = new Properties();
StandardFileSystemManager manager = new StandardFileSystemManager();

props.load(new FileInputStream("D:\\common.properties")); // + propertiesFilename));
String serverAddress = props.getProperty("serverAddress").trim();
String userId = props.getProperty("userId").trim();
String password = props.getProperty("password").trim();
String remoteDirectory = props.getProperty("remoteDirectory").trim();
String localDirectory = props.getProperty("localDirectory").trim();

//Initializes the file manager
manager.init();

//Setup our SFTP configuration
FileSystemOptions opts = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000);

//Create the SFTP URI using the host name, userid, password,  remote path and file name
String sftpUri = "sftp://" + userId + ":" + password +  "@" + serverAddress + "/" +
     remoteDirectory + fileToDownload;

// Create local file object
String filepath = localDirectory + fileToDownload;
File file = new File(filepath);
FileObject localFile = manager.resolveFile(file.getAbsolutePath());

System.out.println("sftp uri : " + UriParser.encode(sftpUri));
// Create remote file object
FileObject remoteFile = manager.resolveFile(UriParser.encode(sftpUri), opts);

// Copy local file to sftp serverF
localFile.copyFrom(remoteFile, Selectors.SELECT_SELF);
System.out.println("File download successful");

【问题讨论】:

  • 运行您的代码的主机是否可以访问您尝试连接的 SFTP 服务器?这可能是超时的可能原因。
  • 我发现您的问题有不一致的地方可以解释这一点。您说您可以在端口 21 上使用 WinScp 进行连接。您确定要连接到端口 21?您能否验证连接到端口 21 是否正常工作。将端口更改为 21 以外的端口,看看它是否停止工作。如果是这样,那么认为我知道出了什么问题。
  • @Steve - 是的,我正在连接到端口 21。连接到端口 21 允许我访问 WinScp。我将端口号更改为 22,但它不允许我登录 WinScp。
  • 所以你很可能在 WinSCP 中使用 FTP 协议。在 Java 代码中使用 SFTP 时。这是两个完全不兼容的协议。
  • 哈!是的,@MartinPrikryl 打败了我。 21 是普通旧 FTP 的端口号,而不是 SFTP。 SFTP 侦听端口 22。因此,您尝试使用错误类型的客户端(SFTP 客户端)来访问 FTP 服务器。您遇到了超时,因为 SFTP 客户端代码将尝试连接到端口 22,而您的标准 FTP 服务器上没有任何东西正在侦听端口 22。您需要找到并使用标准 FTP Java 客户端库。

标签: java sftp jsch apache-commons-vfs


【解决方案1】:

您在 WinSCP 中使用 FTP,而不是 SFTP。这是两个完全不兼容的协议。

或者可能是 FTP 的加密变体,FTPS(基于 TLS/SSL 的 FTP)——这可能会导致您与 SFTP 混淆。

将 URL 中的 sftp:// 替换为 ftp://ftps://
https://commons.apache.org/proper/commons-vfs/filesystems.html#FTP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 2020-09-16
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    相关资源
    最近更新 更多