我试图使用Java使用SFTP(而不是FTPS)从服务器检索一个文件。我该怎么做呢?


当前回答

hierynomus/sshj有一个完整的SFTP版本3的实现(OpenSSH实现的)

来自SFTPUpload.java的示例代码

package net.schmizz.sshj.examples;

import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.sftp.SFTPClient;
import net.schmizz.sshj.xfer.FileSystemFile;

import java.io.File;
import java.io.IOException;

/** This example demonstrates uploading of a file over SFTP to the SSH server. */
public class SFTPUpload {

    public static void main(String[] args)
            throws IOException {
        final SSHClient ssh = new SSHClient();
        ssh.loadKnownHosts();
        ssh.connect("localhost");
        try {
            ssh.authPublickey(System.getProperty("user.name"));
            final String src = System.getProperty("user.home") + File.separator + "test_file";
            final SFTPClient sftp = ssh.newSFTPClient();
            try {
                sftp.put(new FileSystemFile(src), "/tmp");
            } finally {
                sftp.close();
            }
        } finally {
            ssh.disconnect();
        }
    }

}

其他回答

我使用这个叫做Zehon的SFTP API,它很棒,很容易使用,有很多示例代码。以下是http://www.zehon.com网站

在Jsch之上的一个很好的抽象是Apache common -vfs,它提供了一个虚拟文件系统API,使得SFTP文件的访问和写入几乎是透明的。这对我们来说很有效。

有3个成熟的用于SFTP的Java库:Commons VFS、SSHJ和JSch

总而言之,如果你不需要Commons VFS提供的其他存储支持,那么SSHJ具有最清晰的API,是其中最好的API。

下面是从github编辑的SSHJ示例:

final SSHClient ssh = new SSHClient();
ssh.loadKnownHosts(); // or, to skip host verification: ssh.addHostKeyVerifier(new PromiscuousVerifier())
ssh.connect("localhost");
try {
    ssh.authPassword("user", "password"); // or ssh.authPublickey(System.getProperty("user.name"))
    final SFTPClient sftp = ssh.newSFTPClient();
    try {
        sftp.get("test_file", "/tmp/test.tmp");
    } finally {
        sftp.close();
    }
} finally {
    ssh.disconnect();
}

我找到的最好的解决办法是帕拉米科。有一个Java版本。

你也有JFileUpload SFTP插件(Java也是): http://www.jfileupload.com/products/sftp/index.html