Я пытаюсь реализовать бота, который имитирует пользователя, который пишет/читает на консоли 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)
но по очевидным причинам мне это не нравится.
Подумайте о том, как использовать стороннюю библиотеку 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();
}
Вот ссылка на полный рабочий пример.