このエントリーをはてなブックマークに追加

Javaでsshを利用する。

javaにてsshを利用する機会があったのでメモ
利用したライブラリは「JSch」

maven

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
</dependency>

サンプル

package jp.dip.snowsaber;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class SshSample {

   public static void main(String[] args) {
      new SshSample().execute();
   }

   public void execute() {
      // コマンド
      String command = "cat /var/log/sample.log";

      // sshの接続を実施し、コマンドを実行する
      callSshCommand(session -> {
         String result = callCommand(session, command);
         System.out.println(result);
         return null;
      });

   }

   public <R> R callSshCommand(SshFunction<Session, R> func) {
      JSch jsch = new JSch();
      Session session = null;
      // サーバ
      String host = "ホストのipアドレス";
      // ポート
      int port = 22;
      // ユーザ
      String user = "ユーザ";
      // パスワード
      String password = "パスワード";
      try {
         session = jsch.getSession(user, host, port);
         // known_hostsのチェックをスキップ
         session.setConfig("StrictHostKeyChecking", "no");
         session.setPassword(password);
         session.connect();
         return func.apply(session);
      } catch (JSchException e) {
         throw new RuntimeException(String.format("接続に失敗しました ホスト:%s, port:%d, ユーザ:%s", host, port, user), e);
      } finally {
         if (session != null && session.isConnected()) {
            session.disconnect();
         }
      }

   }

   /** ssh実行ようのインターフェイス */
   @FunctionalInterface
   public interface SshFunction<Session, R> {
      public R apply(Session session);
   }

   /**
    * コマンドを実行する
    *
    * @param session
    *            実行するセッション
    * @param command
    *            実行するコマンド
    * @return 実行後の標準出力
    */
   public String callCommand(Session session, String command) {
      ChannelExec channel = null;
      try {
         channel = (ChannelExec) session.openChannel("exec");
         channel.setCommand(command);
         channel.connect();
         try (BufferedInputStream bin = new BufferedInputStream(channel.getInputStream())) {
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int length;
            while (true) {
               length = bin.read(buf);
               if (length == -1) {
                  break;
               }
               bout.write(buf, 0, length);
            }
            return new String(bout.toByteArray(), StandardCharsets.UTF_8);
         }
      } catch (Exception e) {
         throw new RuntimeException(String.format("error:command - [%s]", command), e);
      } finally {
         if (channel != null && channel.isConnected()) {
            channel.disconnect();
         }
      }
   }
}