Как создать бота, имитирующего взаимодействие с пользователем оболочки SSH?

1

Я пытаюсь реализовать бота, который имитирует пользователя, который пишет/читает на консоли ssh в Java. Я использую библиотеку АОХ для управления ssh-соединением. Это код, с которого я начал:

JSch jsch = new JSch();
Session session = jsch.getSession(username, ipAddress, port);
session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect(connectionTimeoutInMillis);
Channel channel = session.openChannel("shell");
InputStream is = new InputStream();
OutputStream out= new OutputStream();
channel.setInputStream(is);
channel.setOutputStream(out);
channel.connect();
channel.disconnect();
is.close();
out.close();
session.disconnect();

Очевидно, что InputStream и OutputStream в коде неправильны, мне нужно использовать то, что бот может использовать для отправки строки (командной строки) и для получения строки (результат выполнения команды), какой тип потоков должен я использовать использовать для этого?

Кроме того, я заметил, что если я отправлю команду и использую System.out качестве выходного потока, то во многих случаях вывод пуст, потому что (я почти уверен в этом) приложение Java завершается до того, как выполнение команды произвело результат. Какова наилучшая практика рассказать слушателю канала канала "Дождитесь завершения выполнения команды", а затем продолжим? После выполнения команды я мог бы использовать Thread.sleep(someTime) но по очевидным причинам мне это не нравится.

Теги:
ssh
jsch

1 ответ

1
Лучший ответ

Подумайте о том, как использовать стороннюю библиотеку Java, подобную Expect, чтобы облегчить взаимодействие с удаленной оболочкой. Вот хороший набор параметров, которые вы можете попробовать:

Вы также можете взглянуть на мой собственный проект с открытым исходным кодом, который я создал некоторое время назад как преемник существующих. Это называется ExpectIt. Преимущества моей библиотеки указаны на главной странице проекта.

Ниже приведен пример взаимодействия с публичной удаленной службой SSH с использованием JSch. Это должно быть легко принять его для вашего случая использования.

    JSch jSch = new JSch();
    Session session = jSch.getSession("new", "sdf.org");
    session.connect();
    Channel channel = session.openChannel("shell");

    Expect expect = new ExpectBuilder()
            .withOutput(channel.getOutputStream())
            .withInputs(channel.getInputStream(), channel.getExtInputStream())
            .withErrorOnTimeout(true)
            .build();
    try {
        expect.expect(contains("[RETURN]"));
        expect.sendLine();
        String ipAddress = expect.expect(regexp("Trying (.*)\\.\\.\\.")).group(1);
        System.out.println("Captured IP: " + ipAddress);
        expect.expect(contains("login:"));
        expect.sendLine("new");
        expect.expect(contains("(Y/N)"));
        expect.send("N");
        expect.expect(regexp(": $"));
        expect.send("\b");
        expect.expect(regexp("\\(y\\/n\\)"));
        expect.sendLine("y");
        expect.expect(contains("Would you like to sign the guestbook?"));
        expect.send("n");
        expect.expect(contains("[RETURN]"));
        expect.sendLine();
    } finally {
        session.close();
        ssh.close();
        expect.close();
    }

Вот ссылка на полный рабочий пример.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню