2014-11-08 2 views
0

Когда мы запустим Runtime.exec(cmd), с какого пользователя он будет запущен? Например, user1 (на Unix) побежал java -jar Test.jar. В этой программе есть Runtime.exec("whoami"). Какой идентификатор пользователя мы должны получить?Пользователь Runtime.exec (cmd)


У меня есть экранный терминал, где был запущен chrootuid cmd и запущена программа java. И каким-то образом, whoami командует с этого pr. возвращает НЕ ТАКОЙ ИД пользователя, как владелец chrootuid, от которого было указано имя J.p. побежал. Может ли кто-нибудь объяснить это?

+0

* 'владелец chrootuid' * не имеет к этому никакого отношения. Он должен работать как * newuser *, поставленный в * chrootuid. * – EJP

ответ

1

Как говорит @SLaks, сценарий будет запущен как тот же пользователь, который запустил JVM в первую очередь.

Сводка:

  • виртуальная машина запускается в рамках процесса;
  • этот процесс имеет множество данных, унаследованных от его родителя, по которому пользователь, который его запустил;
  • Стандартный Java API не имеет возможности модифицировать пользователя;
  • , даже если у него была такая мощность, изменение работы пользователя в любом случае потребует повышенных привилегий.

Итак, вот вы: процесс «раздвоения» будет работать с теми же учетными данными, что и JVM.


Теперь еще немного информации о запуске отдельного процесса в целом ...

В Java, вы действительно хотите использовать ProcessBuilder вместо Runtime.exec(), по следующим причинам:

  • позволяет управлять выходом ввода/вывода;
  • он позволяет указать аргументы командной строки «правильный путь» (подумайте: аргумент с пробелами);
  • это позволяет отсрочить исполнение (.start()).

Но это явно не позволяет осуществлять мелкомасштабный контроль общих ресурсов и модификаций привилегий, как это делают собственные API. Тем не менее, ProcessBuilder лучше, чем Runtime.exec() с большим отрывом, но Java еще не испытала радикальных изменений в обработке процессов, поскольку новый java.nio.file составляет File: революция.

+0

Хорошо, у меня есть 'screen''d терминал, где был запущен' chrootuid' cmd и запущена java-программа. И каким-то образом, whoami командует с этого pr. возвращает NOT SAME идентификатор пользователя как владельца chrootuid, из которого было указано имя J.p. побежал. – user2781598

+0

@ user2781598 Если это часть вашего вопроса, она должна быть отредактирована в ваш вопрос, где все это увидят. – EJP

+0

Ух, хорошо, я только что открыл команду 'chrootuid' ... Теперь в процессе есть два типа пользователей: UID владельца и эффективный UID; в соответствии с man-страницей 'whoami', результатом является эффективный UID.Честно говоря, довольно давно я имею дело с привилегиями процесса на этом уровне, насколько я даже не напоминаю реальную разницу между ними! – fge

2

Все дочерние процессы выполняются как один и тот же пользователь, что и родительский процесс.

Смежные вопросы