Java и SSH: поддержание соединения - PullRequest
1 голос
/ 03 августа 2010

Цель: удаленное управление 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 всегда закрывается после отправки начальной команды.

1 Ответ

1 голос
/ 12 августа 2010

Вопрос 1: можно ли использовать sshj для «ожидания» запроса пароля? Я не смог найти никакой документации, относящейся к этому типу контроля.

В основном sshj предоставляет дескриптор потоков ввода-вывода оболочки или команды и методы для получения таких вещей, как состояние выхода.

Вопрос 2. Как я могу изменить приведенный выше код Expect, чтобы поддерживать постоянное соединение, к которому я могу сделать несколько звонков? Я хочу продолжить взаимодействие после того, как достигну состояния аутентификации как root, но Spawn всегда закрывается после отправки начальной команды.

Поддерживается мультиплексирование сессий, даже одновременных сессий через одно соединение SSH. Но учтите, что у вас может быть только один сеанс для одной оболочки / команды / подсистемы.

Какой тип сеанса вы используете, то есть Session.Shell (через session.startShell) или Session.Command (через session.exec)? В последнем случае, когда вы закончите выполнение команды, сеанс будет означать закрытие, и это ожидаемое поведение.

Обычно я бы не рекомендовал Shell over Command, но поскольку у вас есть ExpectJ, который, я думаю, может работать с приглашениями и тому подобным, вы можете пойти по этому пути. Если есть проблемы с отображением символов или чего-то подобного, поиграйтесь с параметрами PTY (вместо session.allocateDefaultPTY вызовите session.allocatePTY, который принимает целую кучу аргументов, взгляните на источник для allocateDefaultPTY ).

Примеры кода: Оболочка , Команда

Кроме того, если вы сузили проблему до ошибки с помощью sshj, сообщите об этом на трекере:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...