[Java] Apache MINA SSHDでSCPクライアントを作る(圧縮転送)


2017/4/25 作成

・Java
・SCP Client
・Compression(圧縮転送)ができる
・ファイル出力しなくてもよい(=メモリにそのまま読める)

という条件で、SCPクライアントのJavaライブラリをいろいろ試してみたのだが、
どれもビミョーに条件を満たさず、悪戦苦闘の末に行き着いたのがApache MINA SSHDだった。
ただこれも、ドキュメントが不足にネットの実装例も古かったりと苦戦させられた。

なのでここに結果をメモをする。

https://github.com/apache/mina-sshd

MinaSCP.java

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.sshd.client.SshClient;
import org.apache.sshd.client.scp.ScpClient;
import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.compression.BuiltinCompressions;
import org.apache.sshd.common.compression.CompressionFactory;

public class MinaSCP {

	public static void main(String[] args) throws Exception {

		String hostname = "192.168.1.1";
		int port = 22;

		String user = "username";
		String password = "password ";

		String remotefilepath = "/home/username/hoge.txt";

		Long timeout = 10000L;

		SshClient client = SshClient.setUpDefaultClient();

		// 圧縮転送の設定(手元の環境だとdelayedZlibは使えてzlibは使えなかった)
		List<CompressionFactory> fs = new ArrayList<CompressionFactory>();
		fs.add(BuiltinCompressions.delayedZlib);
		fs.add(BuiltinCompressions.zlib);
		fs.add(BuiltinCompressions.none);
		client.setCompressionFactories(NamedFactory.setUpBuiltinFactories(false, fs));

		client.start();

		ClientSession session = client.connect(user, hostname, port).verify(timeout).getSession();

		session.addPasswordIdentity(password);

		session.auth().verify(timeout);

		ScpClient scp = session.createScpClient();

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		scp.download(remotefilepath, baos);

		System.out.println(baos.toString());

		client.stop();
	}
}

pom.xml

		<!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-core -->
		<dependency>
			<groupId>org.apache.sshd</groupId>
			<artifactId>sshd-core</artifactId>
			<version>1.4.0</version>
		</dependency>

関連記事: