Выполнение команд UNIX от имени другого пользователя, от Java

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

например: скажем, у нас есть пользователь, Джим, который хочет увидеть, что находится в домашнем каталоге Боба, и (по какой-то причине) Джим имеет доступ к выполнению ls, тогда как Боб этого не делает. в настоящее время мы вошли в систему как Боб. Вот что мы (могли бы) сделать:

bob@host$ su jim && ls ~bob

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

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

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

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

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

но это также не работает, поскольку у меня нет разрешения на настройка беспарольного СШ.

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

какие предложения?

P. S: Java версии 1.4.2, не удается обновить; AIX UNIX 5.3.

6 ответов


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


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


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


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

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

su jim -c ls ~Bob

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

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

OutputStream standardInput = process.getOutputStream();
Writer standardInputWriter = new OutputStreamWriter(standardInput);
standardInputWriter.write("password\n");
standardInputWriter.close();

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

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

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

su jim -c 'ls ~bob'