"Sudo su - weblogic" через программу на Java? - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь подключить мой удаленный unix-компьютер и выполнить некоторые команды ssh с помощью java-программы.

connection = new Connection(hostname);                                                  
connection.connect();
boolean isAuthenticated = connection.authenticateWithPassword(username, password);
if (isAuthenticated == false)
    throw new IOException("Authentication failed.");    
Session session = connection.openSession();
session.execCommand("sudo su - weblogic");  

Здесь снова нужен пароль & ofcrs, я не могу предоставить, потому что нет терминала.Таким образом, был создан файл user.sh @ my unix user home direcotry (/home/..../bharat) с содержанием ниже.

echo <mypassword> | sudo -S su - weblogic
sudo -S su - weblogic

но теперь, если я позвоню bash user.sh как показано ниже

session.execCommand("bash user.sh"); 

после входа в систему с моим пользователем в Java, он выдает ошибку ниже и не может найти решение для этого пока.

sudo: sorry, you must have a tty to run sudo
sudo: sorry, you must have a tty to run sudo

Пожалуйста, помогите :)

Ответ отправки ("cd /u02/app/oracle/xyz/admin/domains/11.1.1.9/xxxx_xx_xxx_xxx.domain/shared/logs/ хххх ");ниже -

Выделенный красный ==> показывает ответ, который я получаю на данный момент.

Выделенный синий ==> Ожидаемый ответ.

Выделенный зеленый ==>работает нормально, если я посылаю 4 меньшие команды, разделяя ту же команду.

enter image description here

1 Ответ

0 голосов
/ 10 июня 2018

Как вы и @rkosegi говорите, su нужен терминальный сеанс для пароля.

Это похоже на библиотеку Ganymed SSH-2 в примере?У этого есть опция для сеанса оболочки.Очевидно, что теперь вам нужно обрабатывать чтение и запись напрямую через stdout и stdin.

Например, с помощью нескольких методов, чтобы упростить его:

public class SshTerminal {
    private Connection connection;
    private Session session;

    private Reader reader;
    private PrintWriter writer;
    private String lastResponse;

    public SshTerminal(String hostname, String username, String password)
            throws JSchException, IOException {
        connection = new Connection(hostname);
        connection.connect();
        boolean isAuthenticated = connection.authenticateWithPassword(username,
                password);
        if (isAuthenticated == false)
            throw new IOException("Authentication failed.");
        session = connection.openSession();
        session.requestDumbPTY();
        session.startShell();

        writer = new PrintWriter(session.getStdin());
        reader = new InputStreamReader(session.getStdout());
    }

    public void send(String command) {
        writer.print(command + "\n");
        writer.flush();
    }

    public void waitFor(String expected) throws IOException {
        StringBuilder buf = new StringBuilder();
        char[] chars = new char[256];
        while (buf.indexOf(expected) < 0) {
            int length = reader.read(chars);
            System.out.print(new String(chars, 0, length));
            buf.append(chars, 0, length);
        }

        int echoEnd = buf.indexOf("\n");
        int nextPrompt = buf.lastIndexOf("\n");
        if (nextPrompt > echoEnd)
            lastResponse = buf.substring(echoEnd + 1, nextPrompt);
        else
            lastResponse = "";
    }

    public String getLastResponse() {
        return lastResponse;
    }

    public void disconnect() {
        session.close();
        connection.close();
    }
}

Тогда это работало нормально:

    SshTerminal term = new SshTerminal(host, username, password);

    term.waitFor("$ ");
    term.send("su -");
    term.waitFor("Password: ");
    term.send(rootPassword);
    term.waitFor("# ");
    term.send("ls /root");
    term.waitFor("# ");
    term.send("cat /file-not-found 2>&1");
    term.waitFor("# ");

    term.send("cat /var/log/messages");
    term.waitFor("# ");
    String logFileContent = term.getLastResponse();

    term.send("exit");
    term.waitFor("$ ");
    term.send("exit");

    term.disconnect();

    String[] lines = logFileContent.split("\n");
    for (int i = 0; i < lines.length; i++)
        logger.info("Line {} out of {}: {}", i + 1, lines.length, lines[i]);

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

Очевидно, что некоторые ответы могут отличаться в вашей среде.

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