Java SFTP 传输库 [关闭]

Posted

技术标签:

【中文标题】Java SFTP 传输库 [关闭]【英文标题】:Java SFTP Transfer Library [closed] 【发布时间】:2011-01-21 18:01:44 【问题描述】:

我正在寻找一个用于 SFTP 文件传输的简单 Java 库。除此之外,我不需要任何其他功能。

我已经尝试过 Zehon 的,但它非常讨厌,而且我认为 8 个 jar 文件对于我需要的这么少的功能来说有点疯狂。

图书馆必须是免费的(就像免费啤酒一样),并且最好是开源的(不是必需的)。

谢谢。

【问题讨论】:

en.wikipedia.org/wiki/SSH_File_Transfer_Protocol 如果您是这个意思,请使用“SFTP”一词。在 FTP、SFTP/SSH、FTPS 和 SSH 上的常规 FTP 隧道之间,首字母缩略词变得模棱两可。 编辑了 sftp 的文本 另见How to retrieve a file from a server via SFTP? 【参考方案1】:

来自 Apache Commons 的 FTPSClient 怎么样?

【讨论】:

你建议的是 FTPS,而不是 SFTP。【参考方案2】:

编辑:我将保留我之前的答案,因为 JSch 仍在许多地方使用,但如果您需要一个文档更好的库,您可以使用 sshj。如何使用它来做 sftp 的一个例子是:

SSHClient ssh = new SSHClient();
ssh.loadKnownHosts();
ssh.connect("host");
try 
    ssh.authPassword("username", "password");
    SFTPClient sftp = ssh.newSFTPClient();
    try 
        sftp.put(new FileSystemFile("/path/of/local/file"), "/path/of/ftp/file");
     finally 
        sftp.close();
    
 finally 
    ssh.disconnect();


使用JSch(例如,Ant 使用的 java ssh 库),您可以这样做:

Session session = null;
Channel channel = null;
try 
    JSch ssh = new JSch();
    ssh.setKnownHosts("/path/of/known_hosts/file");
    session = ssh.getSession("username", "host", 22);
    session.setPassword("password");
    session.connect();
    channel = session.openChannel("sftp");
    channel.connect();
    ChannelSftp sftp = (ChannelSftp) channel;
    sftp.put("/path/of/local/file", "/path/of/ftp/file");
 catch (JSchException e) 
    e.printStackTrace();
 catch (SftpException e) 
    e.printStackTrace();
 finally 
    if (channel != null) 
        channel.disconnect();
    
    if (session != null) 
        session.disconnect();
    

你可以通过这种方式直接使用 JSch,或者通过Commons VFS,但是你必须同时拥有 commons vfs jar 和 jsch jar。

【讨论】:

我找到了一种更简单的方法,我会编辑我的答案。 JSch 是一个很棒的库,但严重缺乏文档。我发现timarcher.com/node/57 是一个非常有用的例子。 感谢您的链接,我会将其添加到答案中。确实,JSch 确实缺乏文档(以及源代码的可读性,就像他们在野外发布它一样),但它完美地完成了这项工作。 JSch 是一个可怕的库。没有文档。如果您尝试通过源代码找出可怕的编码语法(他们不知道缩进是什么......)。使用过时的 Java 类。异常都是自定义的,但都是通用的(它在任何地方都使用相同的自定义异常类,并且大多数时候它是一个空消息)。为什么这么多人推荐这个恶心的东西? sshj 好像好用多了,所以我把它加到答案里了【参考方案3】:

这里是使用JSch 的示例的完整源代码,无需担心 ssh 密钥检查。

import com.jcraft.jsch.*;

public class TestJSch 
    public static void main(String args[]) 
        JSch jsch = new JSch();
        Session session = null;
        try 
            session = jsch.getSession("username", "127.0.0.1", 22);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setPassword("password");
            session.connect();

            Channel channel = session.openChannel("sftp");
            channel.connect();
            ChannelSftp sftpChannel = (ChannelSftp) channel;
            sftpChannel.get("remotefile.txt", "localfile.txt");
            sftpChannel.exit();
            session.disconnect();
         catch (JSchException e) 
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
         catch (SftpException e) 
            e.printStackTrace();
        
    

【讨论】:

这个答案不关心安全性,不关心密钥检查。通过使用StrictHostKeyChecking=no,您将失去任何安全性。不解释后果,不推荐任何人使用。【参考方案4】:

exit() 和 disconnect() 必须放在 finally 块中。在这个例子中,我们有一个永无止境的程序,以防出现异常,因为第二个线程不会终止。

【讨论】:

这不是真正的答案,而是对@Iraklis 上述答案的有用评论。

以上是关于Java SFTP 传输库 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java JSch 进行 SFTP 文件传输

使用JSch实现SFTP文件传输

Java SFTP 服务器库? [关闭]

共享密钥时使用 Java 客户端的 SFTP [重复]

Xshell5下利用sftp上传下载传输文件

Xshell5下利用sftp上传下载传输文件