Выполнение команд 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'