27

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

我已经尝试过 Zehon 的,但它令人难以置信的唠叨,而且我认为 8 个 jar 文件对于我需要的这么少的功能来说有点疯狂。

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

谢谢。

4

4 回答 4

45

编辑:我将保留我之前的答案,因为 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。

于 2010-02-27T09:45:48.863 回答
9

这是使用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();
        }
    }
}
于 2010-04-22T13:02:16.977 回答
4

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

于 2012-03-13T12:44:21.250 回答
-4

来自 Apache Commons的FTPSClient怎么样?

于 2010-02-27T09:18:53.070 回答