Цель: удаленное управление ssh-сервером с одним подключением и несколькими сеансами или одним постоянным сеансом.
Проблема 1: в настоящее время я использую sshj для удаленного управления через SSH, и он работает хорошо, но я не могу заставить его правильно обрабатывать запросы. (хост не предоставляет истинного пользователя root, просто sudo -i, поэтому сначала нужно войти в систему).
Проблема 2: Я загрузил ExpectJ для обработки запроса, но не могу понять, как поддерживать сеанс после того, как я вошел в систему и прошел проверку подлинности как root.
Текущее решение Hack требует повторного входа в систему каждый раз:
public class Expect {
Spawn shell;
ExpectJ exp;
String host;
int port;
String username;
String passwd;
boolean sudo = false;
public Expect(String host,int port,String username,String passwd) throws IOException, TimeoutException, ExpectJException{
exp = new ExpectJ(5);
this.host = host;
this.port = port;
this.username = username;
this.passwd = passwd;
shell = exp.spawn(host, port, username, passwd);
shell.send("sudo netstat -natvp | grep Xtightvnc\n");
System.out.println(shell.getCurrentStandardOutContents());
try{
shell.expect("[sudo] password for #######:");
shell.send(passwd+"\n");
}
catch (IOException ex){
String err = ex.toString();
if(!err.equals("java.io.IOException: End of stream reached, no match found")){
throw new IOException(ex);
}
}
}
Вопрос 1: можно ли использовать sshj для «ожидания» запроса пароля? Я не смог найти никакой документации, относящейся к этому типу контроля.
Вопрос 2. Как я могу изменить приведенный выше код Expect, чтобы поддерживать постоянное соединение, к которому я могу сделать несколько звонков? Я хочу продолжить взаимодействие после того, как достигну состояния аутентификации как root, но Spawn всегда закрывается после отправки начальной команды.