実装説明
JavaでSFTPを行う場合、JSchクラスを使う。
下記は公開鍵、秘密鍵でSFTP接続を行うものである。
ChannelSftp#putでファイルアップロードを行うが、もちろんgetでファイルダウンロードも可能。
pom.xml
<dependencies>
<!-- Other dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-sftp</artifactId>
</dependency>
</dependencies>
SftpClient.java
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.springframework.stereotype.Component;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
@Component
public class SftpClient {
public static void main(String[] args) {
JSch jsch = new JSch();
try {
byte[] bytes = Files.readAllBytes(Paths.get("sftp_rsa path"));
String passphrase = "testsftp";
//鍵ファイルのパスがわかる場合、下記でOK
//jsch.addIdentity("sftp_rsa path");
//鍵ファイルをどこかにおいて、そのファイルのバイトで鍵の設定も可能
//第一引数のprivatekeyは適当でよい。
//第三引数のnullは公開鍵を含めるかどうかでnullでも問題ない
jsch.addIdentity("privatekey", bytes, null ,passphrase.getBytes());
System.out.println("privateKey add OK");
//第一引数はユーザ名、第二引数は接続先URI
Session session = jsch.getSession("sftpUser1", "endpoint");
//パスワード認証する場合は下記設定
//session.setPassword(sftpPassword);
//下記設定がないと、認証で最終的にNGになること多数
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
System.out.println("connect OK");
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
System.out.println("sftp connect OK");
try(InputStream ins = new FileInputStream("./test.bin")){
channel.put(ins, "test.bin");
}
System.out.println("upload OK");
channel.disconnect();
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:
実際の環境でSFTPを使用する場合は、セキュリティ上の理由からパスワードのハードコーディングは避け、セキュアな方法で認証情報を管理することをお勧めします(例:環境変数、暗号化された設定ファイル、AWS環境など)。
余談
上記実装で、AWS Transfer familyを使ってS3にファイルアップロードができた。
SFTPの使える実装例が少なかったので、良い備忘録となった。
参考文献
https://spring.pleiades.io/spring-integration/docs/current/reference/html/sftp.html