2015-10-05 2 views
3

Я создал программу, которая требует прав администратора для выполнения (в этой программе я использую порт, который равен < 1024).
Поэтому я использую эту команду для выполнения:Как найти имя пользователя linux с правами администратора в Java

sudo java -jar example.jar 

В моей программе я пытаюсь создать папку на этом пути:

Paths.get("/home/" + System.getProperty("user.name")) 

Проблема заключается в том, что System.getProperty («user.name») отвечает «root», поэтому мой новый каталог находится в «/ home/root /», но я хочу его в «/ home/my_username».
Мой вопрос: как я могу узнать свое имя пользователя и затем создать новую папку по правильному пути?

ответ

2

Если вы

sudo whoami 

он отвечает

root 

однако если я

sudo bash -c 'echo $SUDO_USER' 

я

peter 

Вы можете сделать это из Java с

String user = System.getenv("SUDO_USER"); 
if (user == null) 
    user = System.getProperty("user.name"); 
3

Вы можете изменить от

Paths.get("/home/" + System.getProperty("user.name")) 

к user.homeSystem Property как

Paths.get(System.getProperty("user.home")) 
+0

Ответ:/root/и это не правильная папка ... – stamina

+0

@stamina. Домашняя папка пользователя root - '/ root'. –

+0

Да, но если мое имя пользователя user1, и я использую sudo, когда я выполняю свою программу, я бы хотел создать новую папку в/home/user1, а не в/root /.
мой вопрос: есть ли способ «открыть» мое оригинальное имя пользователя? – stamina

0

Linux имя пользователя, как правило, связан с переменной в USER среды в login(1) время. Наилучший подход - использовать эту переменную, как и другие средства (например, выполнить команду who(1) или id(1)). Все ее проверяют (используя параметр uid в качестве параметра для сканирования файлов для него). То же самое относится к переменным HOME и SHELL. Все они собираются login(1) при аутентификации пользователя (или библиотеками PAM) и распространяются на все производные процессы через среду.

Странный факт, что вы можете иметь несколько имен пользователей, присоединенных к одной и тому же uid, а не с помощью среды может привести вас к получению неправильного ответа (если вы сканируете /etc/passwd файл с вашим uid в качестве аргумента, вы можете получить другая запись passwd(5) файл --- конечно, с тем же did) Использование:

String username = System.getEnv("USER"); 

для него.

С другой стороны, если вы создали новую сессию (с sudo(1) команды или аналогичной) и переключились как uid и euid и окружающая среда была изменены (перезапускается), как отличить это от правильного логина, сделанного root счета , В этом случае нет следов, которые процесс вызывал пользователь без полномочий root.