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

以下は、ssh キーのチェックを気にせずにJSchを使用した例の完全なソース コードです。

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 ブロックに配置する必要があります。この例では、2 番目のスレッドが終了しないため、例外が発生した場合でもプログラムは終了しません。

于 2012-03-13T12:44:21.250 に答える
-4

Apache Commonsの FTPSClientはどうですか?

于 2010-02-27T09:18:53.070 に答える