Запуск команд UNIX от имени другого пользователя из Java - PullRequest
13 голосов
/ 18 июня 2009

Попытка написать программу на Java, способную выполнять команду UNIX от имени другого пользователя UNIX. У меня есть пароль пользователя, и я знаю команду, которую хочу запустить, но команда должна быть запущена от имени этого пользователя - поэтому я должен сначала войти в систему как этот пользователь.

Например: скажем, у нас есть пользователь, jim, который хочет посмотреть, что находится в домашнем каталоге bob, и (по какой-то причине) jim имеет доступ для выполнения ls, а bob - нет. В данный момент мы вошли как bob . Вот что мы (могли) сделать:

bob@host$ su jim && ls ~bob

Проблема в том, что нам предлагают пароль Джима. Поскольку он запускается из Java-программы, то есть

Process p = Runtime.getRuntime().exec("su jim && ls ~bob");

мы получаем запрос на ввод пароля Джима и кладем трубку. Мы знаем пароль Джима . Однако я не могу войти в нее.

Кроме того, мы не можем использовать сценарий Expect (он не установлен) и мы не можем стать суперпользователем. Я также изучил использование SSH, чтобы попытаться сделать это, поскольку технически мы могли бы сделать

bob@host$ ssh jim@host "ls ~bob"

но это также не работает, так как у меня нет разрешения на установку SSH без пароля.

Мое последнее желание - попытаться использовать библиотеку SSH для Java, поскольку пароль доступен для программы Java, и я смогу войти в систему с этим (и выполнить соответствующую команду). Но так как я собираюсь работать на том же хосте, это кажется излишним.

Есть предложения?

P.S: Java версии 1.4.2, не может обновляться; AIX UNIX 5.3.

Ответы [ 6 ]

8 голосов
/ 18 июня 2009

Установите sudo, попросите пользователя запустить программу Java, введенную в / etc / sudoers для рассматриваемых команд, и использовать sudo -u jim ls ~bob.

6 голосов
/ 18 июня 2009

Проблема решена. Использовал JSch (http://www.jcraft.com/jsch/) для SSH на сервер с известным именем пользователя и паролем и выполнил команду. Спасибо всем за ваши предложения!

0 голосов
/ 18 июня 2009

Я не уверен, что этот код:

Process p = Runtime.getRuntime().exec("su jim && ls ~bob");

будет выполняться в оболочке, необходимой для оценки &&, то есть команды оболочки (/ bin / sh). Вы должны передать команду "ls ~ bob" через командную строку с su. Что-то вроде:

su jim -c 'ls ~bob'
0 голосов
/ 18 июня 2009

Возможно, это сработает:

Process process = Runtime.getRuntime().exec("su jim && ls ~bob");

OutputStream standardInput = process.getOutputStream();
Writer standardInputWriter = new OutputStreamWriter(standardInput);
standardInputWriter.write("password\n");
standardInputWriter.close();
0 голосов
/ 18 июня 2009

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

Используйте getInputStream () и запишите в него свой пароль.

su jim -c ls ~Bob
0 голосов
/ 18 июня 2009

Возможно, реализация Java Expect? ExpectJ появляется при поиске, но я не смог найти никакой документации, касающейся работы под 1.4.2.

...