System.getenv () возвращает ноль, когда супер пользователь

1

Если я запускаю echo $XDG_CURRENT_DESKTOP и sudo echo $XDG_CURRENT_DESKTOP в Ubuntu, я получаю Unity в обоих случаях. Если я в Java пишу System.getenv("XDG_CURRENT_DESKTOP"), он возвращает Unity когда я запускаю программу без привилегий суперпользователя, но возвращает null когда запускаю ее с помощью sudo. Что здесь происходит?

public class GetEnv {
        public static void main(String[] args) {
                System.out.println(System.getenv("XDG_CURRENT_DESKTOP"));
        }
}

Это результат:

$ echo $XDG_CURRENT_DESKTOP
$ Unity
$ sudo echo $XDG_CURRENT_DESKTOP
$ Unity
$ javac GetEnv.java
$ java GetEnv
$ Unity
$ sudo java GetEnv
$ null
Теги:

2 ответа

3
Лучший ответ

Потому что ваше sudo ошибочно.

sudo echo $XDG_CURRENT_DESKTOP

будет расширен до

sudo echo Unity

перед выполнением его как root.

Если вы хотите сохранить настройки у пользователя, выполняющего sudo вам нужно определить переменную среды, которая должна быть сохранена в конфигурации sudo.

Defaults:suboptimal    env_keep += "XGD_CURRENT_DESKTOP", !requiretty
suboptimal    your_host=NOPASSWD: /user/bin/java

то вы можете запустить команду как

sudo java GetEnv

который должен показать вам настройки вызывающего пользователя. В вашем случае Unity.

2

другой gotcha с переменными окружения не копирует их в среду суперпользователя (и поэтому их значение будет равно null):

Используйте флаг -E чтобы сделать это

sudo -E <command>
  • 0
    Это хорошо, но я уверен, что мои пользователи не будут запускать программу с аргументом -E . Любой способ решить это с Java? Кстати, это программа установки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню