Java SFTP传输库

Java SFTP传输库,java,ssh,sftp,Java,Ssh,Sftp,我正在寻找一个非常简单的Java库,用于SFTP文件传输。除此之外,我不需要任何其他功能 我试过Zehon的,但它的naggy令人难以置信,而且我认为8个jar文件对于我需要的这么少功能来说有点疯狂 图书馆必须是免费的(就像免费啤酒一样),最好是开源的(不是要求) 谢谢。从Apache Commons如何?编辑:我将保留我以前的答案,因为JSch仍然在许多地方使用,但是如果您需要更好的文档库,可以使用。如何使用它进行sftp的示例如下: SSHClient ssh = new SSHClient

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

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

图书馆必须是免费的(就像免费啤酒一样),最好是开源的(不是要求)


谢谢。

从Apache Commons如何?

编辑:我将保留我以前的答案,因为JSch仍然在许多地方使用,但是如果您需要更好的文档库,可以使用。如何使用它进行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();
}

使用(例如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,也可以通过这种方式使用JSch,但是您必须同时使用commons vfs jar和JSch jar。

以下是使用示例的完整源代码,无需担心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();
        }
    }
}

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

如果这是您的意思,请使用术语“SFTP”。在FTP、SFTP/SSH、FTPS和通过SSH传输常规FTP之间,缩写词变得模棱两可。请编辑sftpSee的文本。您建议的也是FTPS,而不是SFTP。我找到了一种更简单的方法,我将编辑我的答案。JSch是一个很棒的库,但严重缺乏文档。我发现这是一个非常有用的例子。谢谢你的链接,我会把它添加到答案中。事实上,JSch确实缺乏文档(和源代码可读性,就像他们在野外发布的一样),但它做得非常好。JSch是一个可怕的库。没有文件。如果您试图通过源代码(他们不知道缩进是什么…)来理解它,那么代码语法会很糟糕。使用过时的Java类。异常都是自定义的,但都是泛型的(它在任何地方都使用相同的自定义异常类,大多数情况下它是一条空消息)。为什么这么多人推荐这个恶心的东西?sshj似乎更容易使用,所以我把它添加到了答案中。这不是一个真正的答案,而是对上面@Iraklis'答案的有用评论。这个答案不担心安全性,也不担心密钥检查。使用
strichhostkeychecking=no
会失去任何安全性。在没有解释后果的情况下,不要建议任何人使用它。