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

id:n_shuyo:20060814:1155547412 の続き。
まずはシンプルな ssh によるリモートコマンド実行。


JSch の作法は、

  • 各機能は ChannelSession を extends したチャネルクラスに実装されている
  • JSch インスタンスに対して、openChannel() を発行して、チャネルインスタンスを取得する

というもの。
チャネルクラスは exec(リモート実行), sftp, shell などなどが用意されている(scp はなぜかない……)。


リモートの HostKey チェックをおこなうかどうかの設定は、StrictHostKeyChecking 設定値に ask|yes|no を指定する。
ask を指定した場合はユーザインターフェースを定義して、対話的に確認させることもできるが、ここでは省く。
下の例では no を設定しているが、チェックをさせる場合は、setKnownHosts() で known_hosts ファイルを指定すればよい(コメントアウト部参照)。


標準出力の取得部はとりあえず JSch のサンプルそのまま。
Ganymed の時と同様、実用上はスレッドを起こしてバックエンドで取得するようにしておく必要があるだろう。

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

public class SshTest2 {
	private static final String hostname = "ホスト名";
	private static final String userid   = "ユーザ名";
	private static final String password = "パスワード";

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

	public void doProc() throws JSchException, IOException {
		JSch jsch=new JSch();

		// HostKeyチェックを行わない
		Hashtable config = new Hashtable();
		config.put("StrictHostKeyChecking", "no");
		jsch.setConfig(config);

		// known_hosts を設定して HostKey チェックをおこなう場合
		//String knownhost = "/home/****/.ssh/known_hosts";		// known_hosts ファイルのフルパス
		//jsch.setKnownHosts(knownhost);

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

		// exec command remotely
		String command="ls -l";
		ChannelExec channel=(ChannelExec)session.openChannel("exec");
		channel.setCommand(command);
		channel.connect();

		// get stdout
		InputStream in = channel.getInputStream();
		byte[] tmp=new byte[1024];
		while (true) {
			while(in.available()>0){
				int i=in.read(tmp, 0, 1024);
				if (i<0) break;
				System.out.print(new String(tmp, 0, i));
			}
			if (channel.isClosed()) {
				System.out.println("exit-status: "+channel.getExitStatus());
				break;
			}
			try { Thread.sleep(1000); } catch (Exception ee) {}
		}
		channel.disconnect();
		session.disconnect();

	}
}