使用 org.apache.commons.net.ftp.FTPClient 保护 FTP

Posted

技术标签:

【中文标题】使用 org.apache.commons.net.ftp.FTPClient 保护 FTP【英文标题】:Secure FTP with org.apache.commons.net.ftp.FTPClient 【发布时间】:2012-09-30 00:21:52 【问题描述】:

有没有办法可以使用org.apache.commons.net.ftp.FTPClient 实现安全 FTP?

如果没有,Java 的其他选择是什么?

【问题讨论】:

【参考方案1】:

试用 Java 安全通道

支持SFTP

http://www.jcraft.com/jsch/

例子可以在here找到

【讨论】:

【参考方案2】:

试试 Apache Camel 怎么样,

http://camel.apache.org/ftp2.html

【讨论】:

告诉我们骆驼是什么【参考方案3】:

Apache FTPClient 目前不支持 SFTP。但是,您可以使用 JSch - Java 安全通道。

Onkar Joshi 详细介绍了在 Java 中用于 FTP、SFTP、FTPS 文件传输的库。

一个使用JSch通过SFTP传输文件的例子如下:

    ...

private static final Logger logger = Logger.getLogger(YourClass.class.getName());

public boolean sendDataViaSFTP(String contents) throws Exception 
    String hostname = "<FTP hostname/IP>";
    String username = "<FTP username>";
    String password = "<FTP password>";
    String remoteDirectory = "<FTP remote directory>";
    int ftpPort = 22;

    logger.info("***   Creating FTP session.   ***");
    JSch jsch = new JSch();
    Session session = null;
    Channel channel = null;
    ChannelSftp c = null;

    //Now connect and SFTP to the SFTP Server
    try 
        //Create a session sending through our username and password
        session = jsch.getSession(username, hostname, ftpPort);
        logger.info("***   FTP Session created.   ***");
        session.setPassword(password);

        //Security.addProvider(new com.sun.crypto.provider.SunJCE());
        //Setup Strict HostKeyChecking to no so we dont get the
        //unknown host key exception
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        logger.info("***   Session connected.   ***");

        //Open the SFTP channel
        logger.info("***   Opening FTP Channel.   ***");
        channel = session.openChannel("sftp");
        channel.connect();
        c = (ChannelSftp) channel;

        //Change to the remote directory
        logger.info("***   Changing to FTP remote dir: " + remoteDirectory + "   ***");
        c.cd(remoteDirectory);

        //Send the file we generated
        try 
            String filename = "myfile.txt";

            logger.info("***   Storing file as remote filename: " + filename + "   ***");

            ByteArrayInputStream bis = new ByteArrayInputStream(contents.getBytes());
            c.put(bis, filename);
            return true;
         catch (Exception e) 
            logger.info("***   Storing remote file failed. " + e.toString() + "   ***");
            throw e;
        
     catch (Exception e) 
        logger.info("***   Unable to connect to FTP server. " + e.toString() + "   ***");
        throw e;
     finally 
        //
        //Disconnect from the FTP server
        //
        try 
            if(session != null)
                session.disconnect();

            if(channel != null)
                channel.disconnect();

            if(c != null)
                c.quit();
         catch (Exception exc) 
            logger.severe("***   Unable to disconnect from FTP server. " + exc.toString()+"   ***");
        

        logger.info("***   SFTP Process Complete.   ***");
    



...

【讨论】:

这也是有充分理由的; SFTP 与 FTP 完全不同。它几乎是“Java 不是 javascript”的交易:) 生成 FTPClient 的 Apache Commons Net 项目确实支持 SFTP。 @BrianC Imo,Apache Commons Net 项目不支持 SFTP。不过,有一个用于 SFTP 的 Apache 项目,如果那是您的意思 - Apache MINA - 请参阅 How to write SFTP client using Apache MINA library - 或 Apache Camel,具有讽刺意味的是使用 JSch。 @BabatundeAdeyemi 请不要建议任何人使用StrictHostKeyChecking=no 而不解释其安全后果。对于正确的解决方案,请参阅How to resolve Java UnknownHostKey, while using JSch SFTP library?【参考方案4】:

您可以使用 org.apache.commons.net.ftp.FTPSClient 代替 org.apache.commons.net.ftp。FTPClient 来获得安全的 ftp http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPSClient.html

【讨论】:

【参考方案5】:

首先,请确保您了解 FTPS(安全 FTP)和 SFTP 之间的区别:FTPS versus SFTP versus SCP


如果您需要 FTPS(又名安全 FTP 或 TLS/SSL 上的 FTP),您可以使用 Apache Commons 库中的 FTPSClient class 而不是 FTPClient

如果您需要 SFTP(通过 SSH),您需要一个不同的库。请参阅:How to retrieve a file from a server via SFTP? 或Java SFTP Transfer Library。

【讨论】:

这是更合适的答案!对于 OP,除非他将 FTPS 误认为是安全 FTP,否则服务器似乎恰好支持 SFTP 和 FTPS。否则当前标记的正确答案将不起作用。

以上是关于使用 org.apache.commons.net.ftp.FTPClient 保护 FTP的主要内容,如果未能解决你的问题,请参考以下文章

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

maven中,POM.XML中怎么配置org.apache.commons.net.ftp引用包,求配置代码- -

org.apache.commons.net.ftp.FTPClient下载中文文件夹乱码如何处理?