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