Выполнение команды sudo на моем ящике Amazon EC2 с использованием java-библиотеки sshj

Я пытаюсь выполнить команду sudo на своей машине Amazon EC2, используя библиотеку SSHJ (https://github.com/shikhar/sshj). К сожалению, я не получаю ответа от сервера. Я точно знаю, что другие команды, не относящиеся к sudo, выполняются безупречно. Вот пример кода.

        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        sshClient.addHostKeyVerifier(new PromiscuousVerifier());
        sshClient.connect(host, 22);

        if (privateKeyFile != null) {
            // authenticate using private key file.
            PKCS8KeyFile keyFile = new PKCS8KeyFile();
            keyFile.init(privateKeyFile);
            sshClient.authPublickey(user, keyFile);
        } else {
            // Authenticate using password.
            sshClient.authPassword(user, password);
        }

        // Start a new session
        session = sshClient.startSession();
        session.allocatePTY("vt220", 80,24,0,0,Collections.<PTYMode, Integer>emptyMap());

            Command cmd = null;
                String response = null;
            try (Session session = sshClient.startSession()) {
             cmd = session.exec("sudo service riak start");
             response = IOUtils.readFully(cmd.getInputStream()).toString();
        cmd.join(timeout, timeUnit);
                } finally {
        if (cmd != null) {
            cmd.close();
        }
    }

person systemboot    schedule 05.12.2013    source источник
comment
Нет! судо. В Linux вы можете разрешить определенным пользователям выполнять команды, зарезервированные исключительно для пользователя root.   -  person systemboot    schedule 05.12.2013
comment
Есть ли вывод на сервер? т.е. в /var/log/messages (или что-то подобное на вашем дистрибутиве)   -  person Gareth Davis    schedule 05.12.2013
comment
есть шанс, что вы можете опубликовать свой файл /etc/sudoers, это может быть полезно   -  person Gareth Davis    schedule 05.12.2013
comment
Отключение параметра requiretty (по умолчанию !requiretty) в /etc/sudoers решило проблему. Однако есть ли способ сделать это, не меняя этот параметр?   -  person systemboot    schedule 05.12.2013


Ответы (1)


Это немного догадка, я боюсь, но я думаю, что ваша проблема:

    // Start a new session
    session = sshClient.startSession();
    session.allocatePTY("vt220", 80,24,0,0,Collections.<PTYMode, Integer>emptyMap());

    Command cmd = null;
    String response = null;
    // your allocating a new session there
    try (Session session = sshClient.startSession()) {

         cmd = session.exec("sudo service riak start");
         response = IOUtils.readFully(cmd.getInputStream()).toString();
         cmd.join(timeout, timeUnit);
    } finally {
        if (cmd != null) 
            cmd.close();
    }

Я думаю, что если вы запустите только один сеанс, выделите для него PTY, а затем запустите команду для этого сеанса, вы можете быть в деле:

    session = sshClient.startSession();
    session.allocatePTY("vt220", 80,24,0,0,Collections.<PTYMode, Integer>emptyMap());
    Command cmd = session.exec("sudo service riak start");
    String response = IOUtils.readFully(cmd.getInputStream()).toString();
    cmd.join(timeout, timeUnit);
person Gareth Davis    schedule 06.12.2013
comment
Последующий вопрос: я получаю следующий вывод в ответ на приведенную выше команду sudo service riak start: Запуск riak: [60G[[0;32m OK [0;39m]. Как я могу перевести в обычный текст. - person systemboot; 09.12.2013
comment
Боюсь, вы мало что можете сделать с escape-кодами, скрипт выводит их, вам просто нужно иметь с ними дело. Конечно, у других могут быть лучшие варианты... задайте новый вопрос :) - person Gareth Davis; 10.12.2013
comment
Один из возможных способов расшифровать это с помощью библиотеки jansi (jansi.fusesource.org). AnsiConsole.out.println(response) решает эту проблему. - person systemboot; 10.12.2013
comment
приятно знать, но видите ли, это было бы гораздо полезнее для остального мира как вопрос + ответ - person Gareth Davis; 11.12.2013
comment
Я пытаюсь сделать что-то похожее на вышеизложенное, но использую Ubuntu 16.04 с openssh-сервером. Я могу выполнять обычные команды, но команды sudo, похоже, не разрешаются. Не могли бы вы посоветовать? ` Session session = sshClient.startSession(); session.allocatePTY(vt220, 80,24,0,0,Collections.‹PTYMode, Integer›emptyMap()); Команда cmd = session.exec(sudo touch /opt/sudo-touch.txt); Строка соотв. = IOUtils.readFully(cmd.getInputStream()).toString(); System.out.println(ответ: +resp); cmd.join(1000, TimeUnit.MILLISECONDS);` - person simgineer; 10.07.2017
comment
@simgineer создайте новый вопрос, посмотрите codeblog .jonskeet.uk/2010/08/29/writing-the-perfect-question плюс вы можете написать, почему этот вопрос/ответ не одно и то же, чтобы его не дублировали вне - person Gareth Davis; 13.07.2017