id:n_shuyo:20060814:1155547412 と id:n_shuyo:20060815:1155613198 の続き。
pure Java な SSH-2 実装である JSch で ssh のコマンド実行を実装してみたが、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(); } }