java-file-sftp
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上]にあります。