LINUX.ORG.RU

[java] Получить права другого пользователя


0

1

Возможно, вопрос тупой, и я где-то проглядел ответ, но всё же.

Нужно выполнить команду из java-кода. Как выполнить от того же пользователя, который запустил программу - понятно.

Сначала получаю Runtime.getRuntime(), потом у этого runtime вызываю метод exec(), на выходе получаю экземпляр класса Process.

У этого экземпляра класса Process есть три метода - для стандартных потоков - ввода, вывода и ошибок. Допустим, получаю поток ввода - вывожу его на экран - фактически вывод на консоль. Например, если запустить hostname - я таким образом увижу имя хоста, всё правильно. :)

А вот как получить права другого пользователя? Если вызвать, например, su - то есть нюанс. Нюанс в том, что нужно ещё пароль ввести... притом после ввода. А потом хотелось бы получить оболочку, в которой вводить команды от другого пользователя... ведь от текущего runtime вводить бесполезно - это будет тот же пользователь.

Или, может, мне этот su вообще не нужен? Объясните, как мне правильно поступить в данной ситуации? :) Необязательно на примере java - можно другой ЯП, мне понять сам принцип.

Пароль от пользователя я типа знаю, пароль в коде задаётся (например)... Считаем, что нужный пользователь есть в группе wheel и имеет права su запускать (или можно вообще заменить на sudo).

читай про sudo и настрой его, чтобы определённому юзеру можно было определённые команды без пароля запускать.

deadman ★★ ()
Ответ на: комментарий от zhuravlik

Спасибо. Именно Ъ-способ мне более интересен. Почитаю.

BattleCoder ★★★★★ ()
Ответ на: комментарий от deadman

Не годится. Совсем. Мне нужно именно с паролем... И пользователей много (в общем случае без ограничений), у каждого свой пароль (все разные) растить конфиг sudoers - не айс.

BattleCoder ★★★★★ ()
Ответ на: комментарий от zhuravlik

Эээ, по второй ссылке это же C#, да ещё и под шиндошс =) мне, вообще говоря, нужно только под linux (это пока, потом может и о кроссплатформенности подумаю, но нужны в этом никакой нет). Да и права именно администратора или root мне не нужны, более того - нежелательны... только права определённых пользователей (не root-а)

BattleCoder ★★★★★ ()
Ответ на: комментарий от BattleCoder

То, что написал zhuravlik не просто Ъ, но и единственный безкостыльный метод получения прав другого пользователя. Если интересует конкретная реализация, то посмотри вот это. (немножко переделанный код из Jetty).

Если уж так требуется избегать прав рута, то можно сделать как-то так:

echo "password" | sudo -u username -S command

beka ()
Ответ на: комментарий от beka

Интерсный код... попробую таким образом что-нибудь запустить... тот же whoami =)

только, я так понял, мне придётся, зная имя пользователя, получить его UID - вообще задача тривиальная. вроде как.

Один нюанс - не пойму, что такое GID. То есть понятно, что это идентификатор группы... но какую он несёт роль? Ведь каждый UID имеет свой набор групп (например, users,audio,video,floppy, и т.п.), разве GID не должен определяться автоматически из настроек системы?

Впрочем, GID мне наверное не нужен.

BattleCoder ★★★★★ ()
Ответ на: комментарий от BattleCoder

только, я так понял, мне придётся, зная имя пользователя, получить его UID - вообще задача тривиальная. вроде как.

да, тривиальная - getpwnam()

Один нюанс - не пойму, что такое GID...

Иногда требуется получить или установить ид группы процесса. Соотвественно, если тебе не трубуются манипуляций с группами - то не используй ;)

beka ()

Необязательно на примере java - можно другой ЯП, мне понять сам принцип.

весело так читать. про вирусы небось никогда ничего не слыхал?

Karapuz ★★★★★ ()
Ответ на: комментарий от BattleCoder

а зачем вообще нужно бредовое разделение на пользователей и суперпользователей и механизмы разграничения прав?

Karapuz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.