JavaでSFTPを介してファイルを転送する

1. 概要

このチュートリアルでは、* JavaでSFTPを使用してリモートサーバーからファイルをアップロードおよびダウンロードする方法について説明します*。
JSch、SSHJ、およびApache Commons VFSの3つの異なるライブラリを使用します。

*2. JSch *の使用

最初に、JSchライブラリを使用してリモートサーバーからファイルをアップロードおよびダウンロードする方法を見てみましょう。

* 2.1。 Mavenの構成*

_pom.xml_に_jsch_依存関係を追加する必要があります。
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>
_jsch_の最新バージョンは、https://search.maven.org/search?q = g:com.jcraft%20AND%20a:jsch [Maven Central]にあります。

* 2.2。 JSch *のセットアップ

次に、JSchをセットアップします。
JSchを使用すると、パスワード認証または公開キー認証を使用してリモートサーバーにアクセスできます。 この例では、*パスワード認証を使用します*:
private ChannelSftp setupJsch() throws JSchException {
    JSch jsch = new JSch();
    jsch.setKnownHosts("/Users/john/.ssh/known_hosts");
    Session jschSession = jsch.getSession(username, remoteHost);
    jschSession.setPassword(password);
    jschSession.connect();
    return (ChannelSftp) jschSession.openChannel("sftp");
}
上記の例では、_remoteHost_はリモートサーバーの名前またはIPアドレスを表します(つまり、 _example.com_)。 テストで使用される変数を次のように定義できます。
private String remoteHost = "HOST_NAME_HERE";
private String username = "USERNAME_HERE";
private String password = "PASSWORD_HERE";
また、次のコマンドを使用して_known_hosts_ファイルを生成できます。
ssh-keyscan -H -t rsa REMOTE_HOSTNAME >> known_hosts

* 2.3。 JSch *を使用したファイルのアップロード

次に、*リモートサーバーにファイルをアップロードするには、_ChannelSftp.put()_ *メソッドを使用します。
@Test
public void whenUploadFileUsingJsch_thenSuccess() throws JSchException, SftpException {
    ChannelSftp channelSftp = setupJsch();
    channelSftp.connect();

    String localFile = "src/main/resources/sample.txt";
    String remoteDir = "remote_sftp_test/";

    channelSftp.put(localFile, remoteDir + "jschFile.txt");

    channelSftp.exit();
}
この例では、メソッドの最初のパラメーターは転送されるローカルファイルを表します。たとえば、_src / main / resources / sample.txt、_で、_remoteDir_はリモートサーバーのターゲットディレクトリのパスです。

* 2.4。 JSch *を使用したファイルのダウンロード

また、_ChannelSftp.get()_ *を使用してリモートサーバーからファイルをダウンロードすることもできます。
@Test
public void whenDownloadFileUsingJsch_thenSuccess() throws JSchException, SftpException {
    ChannelSftp channelSftp = setupJsch();
    channelSftp.connect();

    String remoteFile = "welcome.txt";
    String localDir = "src/main/resources/";

    channelSftp.get(remoteFile, localDir + "jschFile.txt");

    channelSftp.exit();
}
_remoteFile_はダウンロードするファイルのパスで、_localDir_はターゲットローカルディレクトリのパスを表します。

*3. SSHJ *を使用する

次に、SSHJライブラリを使用して、リモートサーバーからファイルをアップロードおよびダウンロードします。

* 3.1。 Mavenの構成*

最初に、依存関係を_pom.xml_に追加します。
<dependency>
    <groupId>com.hierynomus</groupId>
    <artifactId>sshj</artifactId>
    <version>0.27.0</version>
</dependency>
_sshj_の最新バージョンは、https://search.maven.org/search?q = g:com.hierynomus%20AND%20a:sshj [Maven Central]にあります。

* 3.2。 SSHJ *のセットアップ

次に、* _ SSHClient_ *をセットアップします。
SSHJでは、パスワードまたは公開キー認証を使用してリモートサーバーにアクセスすることもできます。
この例では、パスワード認証を使用します。
private SSHClient setupSshj() throws IOException {
    SSHClient client = new SSHClient();
    client.addHostKeyVerifier(new PromiscuousVerifier());
    client.connect(remoteHost);
    client.authPassword(username, password);
    return client;
}

* 3.3。 SSHJ *を使用したファイルのアップロード

JSchと同様に、* SFTPClient.put()_メソッドを使用してファイルをリモートサーバーにアップロードします*:
@Test
public void whenUploadFileUsingSshj_thenSuccess() throws IOException {
    SSHClient sshClient = setupSshj();
    SFTPClient sftpClient = sshClient.newSFTPClient();

    sftpClient.put(localFile, remoteDir + "sshjFile.txt");

    sftpClient.close();
    sshClient.disconnect();
}
ここに定義する2つの新しい変数があります。
private String localFile = "src/main/resources/input.txt";
private String remoteDir = "remote_sftp_test/";

* 3.4。 SSHJ *を使用したファイルのダウンロード

リモートサーバーからファイルをダウンロードする場合も同様です。_SFTPClient.get()_を使用します。
@Test
public void whenDownloadFileUsingSshj_thenSuccess() throws IOException {
    SSHClient sshClient = setupSshj();
    SFTPClient sftpClient = sshClient.newSFTPClient();

    sftpClient.get(remoteFile, localDir + "sshjFile.txt");

    sftpClient.close();
    sshClient.disconnect();
}
そして、上記で使用した2つの変数を追加しましょう。
private String remoteFile = "welcome.txt";
private String localDir = "src/main/resources/";

*4. Apache Commons VFS *を使用する

最後に、Apache Commons VFSを使用して、ファイルをリモートサーバーに転送します。
実際、* Apache Commons VFSは内部的にJSchライブラリを使用しています*。

* 4.1。 Mavenの構成*

_commons-vfs2_依存関係を_pom.xml_に追加する必要があります。
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-vfs2</artifactId>
    <version>2.4</version>
</dependency>
_commons-vfs2_の最新バージョンは、https://search.maven.org/search?q = g:org.apache.commons%20AND%20a:commons-vfs2 [Maven Central]にあります。

* 4.2。 Apache Commons VFS *を使用したファイルのアップロード

Apache Commons VFSは少し異なります。
  • _FileSystemManager_を使用してターゲットファイルからFileObjectsを作成し、 FileObjectsを使用してファイルを転送します。*

    この例では、_FileObject.copyFrom()_メソッドを使用してファイルをアップロードします。
@Test
public void whenUploadFileUsingVfs_thenSuccess() throws IOException {
    FileSystemManager manager = VFS.getManager();

    FileObject local = manager.resolveFile(
      System.getProperty("user.dir") + "/" + localFile);
    FileObject remote = manager.resolveFile(
      "sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt");

    remote.copyFrom(local, Selectors.SELECT_SELF);

    local.close();
    remote.close();
}
ローカルファイルパスは絶対パスである必要があり、リモートファイルパスは_sftp:// username:link:/ cdn-cgi / l / email-protection [[email protected]] _で始まる必要があることに注意してください。

* 4.3。 Apache Commons VFS *を使用したファイルのダウンロード

リモートサーバーからのファイルのダウンロードは非常によく似ています。
@Test
public void whenDownloadFileUsingVfs_thenSuccess() throws IOException {
    FileSystemManager manager = VFS.getManager();

    FileObject local = manager.resolveFile(
      System.getProperty("user.dir") + "/" + localDir + "vfsFile.txt");
    FileObject remote = manager.resolveFile(
      "sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteFile);

    local.copyFrom(remote, Selectors.SELECT_SELF);

    local.close();
    remote.close();
}

5. 結論

この記事では、JavaのリモートSFTPサーバーからファイルをアップロードおよびダウンロードする方法を学びました。 このため、複数のライブラリを使用しました:JSch、SSHJ、およびApache Commons VFS。
完全なソースコードは、https://github.com/eugenp/tutorials/tree/master/libraries-io [GitHub上]にあります。