2015-11-23 2 views
1

Если я запускаю файл класса java в качестве пользователя sudo, эффективный идентификатор пользователя изменяется на пользователя sudo. Я могу получить эффективный идентификатор пользователя с System.getProperty("user.name"). Однако есть ли способ получить реальный идентификатор пользователя из java-программы? Переменная $ SUDO_USER не является надежной в оболочке.Есть ли способ в Java найти реальный UID, а не эффективный UID в Linux?

+1

Нет, вы не можете; для этого потребуется доступ к примитивам уровня ОС, к которым у Java нет доступа, и даже тогда, если бы это было так, он задал бы вопрос о совместимости API в других ОС, на которых может работать Java (например, Windows не имеет такого понятия) , – fge

+1

@fge: Есть Java API для различных примитивов на уровне ОС; Я не могу сказать, что с рук, что ** определенно не является **, который обеспечивает это, не так ли? Отдельно: Windows имеет олицетворение, которое представляет собой аналогичный сценарий выше, и поэтому потенциально может быть включено в любой такой абстрактный API. –

+1

@ T.J.Crowder Я никогда не говорил, что это невозможно теоретически; просто, что сейчас нет. Мой комментарий все еще стоит. Выдача олицетворений Windows - это не то же самое, что getuid() vs geteuid(). – fge

ответ

0

Да, просто используйте системный вызов getuid(2), а не системный вызов geteuid(2). Эффективный идентификатор изменяется на exec(2) системного вызова, при выполнении файла с правами исполняемым (исполняемый файл, а не оболочка scritp) и Setuid бит (см chmod(2) для описания этого бита)

После того, как вы выполняете файл с битом setuid, у вас будет как реальный использованный идентификатор вашего идентификатора пользователя входа, то действительный идентификатор пользователя будет одним из пользователей, к которому принадлежит файл, и вы (как обычный пользователь, а не root) можете изменять только между реальные и эффективные идентификаторы пользователей с системным вызовом seteuid(2). Для обычного пользователя больше не допускается никаких изменений. Суперпользователь может изменить как системный вызов setuid(2).