Ответ 1
Проблема решена. Использовал JSch (http://www.jcraft.com/jsch/) в SSH на сервер с известным именем пользователя и паролем и выполнил команду. Спасибо всем за ваши предложения!
Попытка написать Java-программу, способную запускать команду UNIX в качестве другого пользователя UNIX. У меня есть пароль пользователя, и я знаю команду, которую я хочу запустить, но команда должна быть запущена в качестве этого пользователя, поэтому я должен сначала войти в систему как этот пользователь.
Например: скажем, у нас есть пользователь, jim, который хочет посмотреть, что в домашнем каталоге bob, и (по какой-либо причине) у jim есть доступ к исполнению ls, тогда как bob этого не делает. В настоящее время мы вошли в систему как bob. Вот что мы можем сделать:
[email protected]$ su jim && ls ~bob
Проблема в том, что мы получаем запрос на использование пароля jim. Поскольку это выполняется из программы Java, то есть
Process p = Runtime.getRuntime().exec("su jim && ls ~bob");
мы получаем подсказку для пароля jim и повесили трубку. Мы знаем пароль jim. Однако я не могу войти в него.
Кроме того, мы не можем использовать Expect script (его не устанавливать), и мы не можем стать суперпользователем. Я также изучил использование SSH, чтобы попробовать это, так как мы могли технически сделать
[email protected]$ ssh [email protected] "ls ~bob"
но это также не работает, поскольку у меня нет разрешения на установку SSH без пароля.
Мое последнее стремление - попытаться использовать SSH-библиотеку для Java, так как пароль доступен для Java-программы, и я бы смог войти с ней (и выполнить правильную команду). Но так как я буду работать на том же хосте, это кажется излишним.
Любые предложения?
P.S: Java версия 1.4.2, не может обновляться; AIX UNIX 5.3.
Проблема решена. Использовал JSch (http://www.jcraft.com/jsch/) в SSH на сервер с известным именем пользователя и паролем и выполнил команду. Спасибо всем за ваши предложения!
Устанавливается ли sudo, пользователь должен запустить программу Java, введенную в /etc/sudoers для соответствующих команд, и использовать sudo -u jim ls ~bob
.
Возможно ли реализация Java Expect? ExpectJ появляется при поиске в Google, но я не мог найти никакой документации относительно работы под 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 su. Что-то вроде:
su jim -c 'ls ~bob'