как передать пользователя и pwd через runtime.exec () в Java - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь запустить простую команду, используя java 1.8 и ОС Solaris 11. Моя программа запускается под определенным пользователем, а команда должна запускаться с правами суперпользователя

вот команда:

Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");

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

проблема в том, что я запускаю его в Java вот мой код

Process proc = Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");
PrintWriter out = new PrintWriter(new OutputStreamWriter(proc.getOutputStream()));
out.println(password);
out.flush();
int exitCode= proc.waitFor();
System.out.println(exitCode);//exitCode = 1
BufferedReader pArgs= new BufferedReader( new InputStreamReader(proc.getInputStream()));
if((line=pArgs.readLine()) != null)
{
    //do something
}
else
{
    //something not working = ERROR 
}

я думаю, что строка равна нулю, потому что в наборе пароля что-то не так, но я не уверен

что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

как передать пользователя и pwd через runtime.exec () в java

Вы не можете под Solaris, если хотите использовать su.

Solaris su использует функцию getpass() для получения необходимого пароля от пользователя.

С Солярис getpass() Справочная страница :

Описание

Функция getpass() открывает управляющий терминал процесса, записывает в это устройство строку с нулевым символом в конце prompt, отключает эхо, считывает строку символов до следующего символа новой строки или EOF, восстанавливает состояние терминала и закрывает терминал.

...

Ошибка

Функции getpass() и getpassphrase() могут не работать, если:

...

ENXIO

Процесс не имеет управляющего терминала.

su либо получит пароль от управляющего терминала, либо произойдет сбой.

Это намеренное проектное решение, делающее практически невозможным выполнение небезопасных действий, таких как автоматический ввод пароля.

0 голосов
/ 03 сентября 2018

Большое спасибо за все ответы. Но мое решение было немного другим. Было решено использовать внешний файл, который мог быть записан и прочитан обоими процессами. Вся цель состояла в том, чтобы снова сделать рукопожатие на случай, если процесс, работающий в корне, упадет (сторожевой таймер).

Так что теперь нет необходимости использовать команду

Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");

Когда корневой процесс запускается, он записывает временную подпись в файл. и если процесс пользователя (который читает файл каждый раз X) обнаружит, что подпись изменилась, он снова сделает рукопожатие.

0 голосов
/ 29 августа 2018

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

Если он просто запрашивает пароль, потому что ему нужен root, вы можете добавить строку в файле sudoers под root, чтобы сказать, что пользователь вашей программы может выполнять эту конкретную команду, как если бы он был root: https://www.linux.com/blog/configuring-linux-sudoers-file.

Это также было бы более безопасно, поскольку у вас не было бы пароля, плавающего вокруг кода.

...