вторник, 4 октября 2011 г.

JSch: Работаем с удалённой машиной по ssh из java-приложения

Хочу рассказать об одной интересной находке: библиотеке JSch. Это реализация ssh соединения на java.  Не уникальная, само собой, но из полудесятка пересмотренных мной, именно она понравилась больше всего.
Возможности весьма впечатляют: аворизация по ключам, порт-форвардинг, соединение через прокси и ещё много чего. Также обрадовала простота работы с библиотекой. Вот, к примеру, реализация удалённой консоли в три десятка строк:

import com.jcraft.jsch.*;
import javax.swing.*;

public class Shell {

  public static void main(String[] arg) {
    try {
      JSch jsch = new JSch();
      String connstr = null;
      if (arg.length > 0) {
        connstr = arg[0];
      } else {
        connstr = JOptionPane.showInputDialog("Enter username:password@hostname", System.getProperty("user.name")+":<pass>"+"@localhost");
      }
      String user = connstr.substring(0, connstr.indexOf(':'));
      String pass = connstr.substring(connstr.indexOf(':')+1, connstr.indexOf('@'));
      String host = connstr.substring(connstr.indexOf('@') + 1);
      Session session = jsch.getSession(user, host, 22);
      session.setPassword(pass);
      session.setConfig("StrictHostKeyChecking", "no");
      session.connect();
      Channel channel = session.openChannel("shell");
      channel.setInputStream(System.in);
      channel.setOutputStream(System.out);
      channel.connect();
    } catch (Exception e) {
      System.out.println(e);
    }
  }
}

Тут мы делаем следующее:
  • Получаем от пользователя настройки подключения (как параметр вызова или диалоговым окном)
  • Создаём сессию и устанавливаем соединение
  • Создаём Channel (в данном случае для интерактивного исполнения команд, хотя есть и другие варианты)
  • "Заворачиваем" системные потоки ввода и вывода в полученный канал
  • наслаждаемся :)

5 комментариев:

  1. библиотека не развивается с 2009 года
    пример не рабочий, попробуй написать сам, а не брать примеры с офсайта

    ОтветитьУдалить
    Ответы
    1. Рад что вас заинтересовала моя статья двухлетней давности :)
      На счёт "библиотека не развивается" смотрим сюда: http://www.jcraft.com/jsch/ChangeLog, обращаем внимание на строку "Last modified: Thu May 9 06:30:51 UTC 2013".
      На счёт "не рабочий" звучит как-то слишком неопределённо. Что именно не получается? Скомпилировать? Запустить? Есть ошибки при установке соединения?
      На счёт "не брать примеры с офсфйта" во-первых глупо не использовать примеры при изучении библиотеки, а во вторых, если "написать сам", то пост будет уже не о Jsch а о том что я "написал сам".

      Удалить
  2. А если мне хочется вводить не через System.in, а скажем из JTextArea как реализовать тогда ввод данных?

    ОтветитьУдалить
    Ответы
    1. ну так нарисуй гуйцы, сделай jtextarea, сделай кнопку и повесь на неё листенер - при нажатии считать данные(getText, рекомендую ещё проверять на правильность ввода) и передай в класс.
      и вообще здесь мейн только для примера.

      Удалить
  3. http://developer-remarks.blogspot.ru/2013/05/ssh-via-jsch-example.html
    Хороший пример, как реализовать ввод данных не через System.in

    ОтветитьУдалить