Java で ssh や scp を呼び出す(6) - JSch で sftp 編

id:n_shuyo:20060814:1155547412 と id:n_shuyo:20060815:1155613198 の続き。
pure JavaSSH-2 実装である JSchssh のコマンド実行を実装してみたが、Ganymed SSH-2 と比べてもコーディング上の特に大きな違いはなかった。


一方、ファイル転送では2つのライブラリの違いが大きく出る。


Ganymed では scp が実装されているが、JSch では scp の実装は行われていない( ChannelScp とやらを実装すれば対応できそうだし、実際 sample ディレクトリには ChannelExec を使って scp を記述した場合のサンプルコードが納められているので、おそらくポリシーとしてあえて scp は実装していないのだろう)。その代わりというのも変だが、sftp が実装されており、かなりポイント高い。
ファイルを1つ転送するだけなら scp でお気楽にやるのが楽ちんだが、もともと立場の危ういプロトコルだし、転送する以外のことはほとんど何もできないので、やっぱりできれば sftp を使いたいというのが人情(?)だろう*1


ということで、とりあえず単純なサンプルプログラム。
ちょっと時間ないので、説明はまた今度。→「Jsh で sftp の解説」

import java.io.*;
import java.util.Vector;
import com.jcraft.jsch.*;

public class SftpTest {
	private static final String hostname = "ホスト名";
	private static final String userid   = "ユーザ名";
	private static final String password = "パスワード";
	private static final String knownhost = "/home/****/.ssh/known_hosts";		// known_hosts ファイルのフルパス

	public static void main(String[] arg){
		try {
			SftpTest test = new SftpTest();
			test.doProc();
		} catch (JSchException ex) { ex.printStackTrace();
		} catch (SftpException ex) { ex.printStackTrace();
		} catch (IOException ex) { ex.printStackTrace();
		}
	}

	public void doProc() throws JSchException, SftpException, IOException {
		JSch jsch=new JSch();
		jsch.setKnownHosts(knownhost);	// known_hosts を設定して HostKey チェックをおこなう

		// connect session
		Session session=jsch.getSession(userid, hostname, 22);
		session.setPassword(password);
		session.connect();

		// sftp remotely
		ChannelSftp channel=(ChannelSftp)session.openChannel("sftp");
		channel.connect();

		// ls
		Vector list = channel.ls(".");
		// System.out.println(list.get(0).getClass().getName());
		System.out.println("---- ls");
		for (int i=0;i<list.size();i++) {
			System.out.println(list.get(i));
		}

		// lstat
		try {
			SftpATTRS stat = channel.lstat("index.html");
			System.out.println("---- lstat");
			System.out.println(stat);
			System.out.println(stat.getSize());
		} catch (SftpException ex) { 
			// ファイルが存在しないとき
			ex.printStackTrace();
		}

		// get
		channel.get("./index.html", "./index.html.dst");

		channel.disconnect();
		session.disconnect();

	}
}

*1:昔ならともかく、今では sshd は立ってるが sftpd は立ってない、なんてまずないだろうし