JAVA_HOME не установлен в скрипте при запуске с использованием sudo

19

Я пытаюсь запустить скрипт установки, который требует установки Java и установки JAVA_HOMEпеременной окружения.

Я установил JAVA_HOMEв , /etc/profileа также в файле я назвал java.shв /etc/profile.d. Я могу echo $JAVA_HOMEи получить правильный ответ, и я могу даже sudo echo $JAVA_HOMEи получить правильный ответ.

В то, install.shчто я пытаюсь запустить, я вставил echo $JAVA_HOME. Когда я запускаю этот скрипт без sudoя вижу директорию Java; когда я запускаю скрипт с sudoним пустым.

Есть идеи, почему это происходит?

Я использую CentOS.

мистифицировать
источник
Я также столкнулся с этой проблемой при работе с Ubuntu 14.04, оба предложенных ответа сработали для меня
laconbass

Ответы:

28

По соображениям безопасности sudoможет очищать переменные среды, поэтому он, вероятно, не получает $ JAVA_HOME. Посмотрите в вашем /etc/sudoersфайле для env_reset.

От man sudoers:

env_reset   If set, sudo will reset the environment to only contain the following variables: HOME, LOGNAME, PATH, SHELL, TERM, and USER (in addi-
           tion to the SUDO_* variables).  Of these, only TERM is copied unaltered from the old environment.  The other variables are set to
           default values (possibly modified by the value of the set_logname option).  If sudo was compiled with the SECURE_PATH option, its value
           will be used for the PATH environment variable.  Other variables may be preserved with the env_keep option.

env_keep    Environment variables to be preserved in the user's environment when the env_reset option is in effect.  This allows fine-grained con-
           trol over the environment sudo-spawned processes will receive.  The argument may be a double-quoted, space-separated list or a single
           value without double-quotes.  The list can be replaced, added to, deleted from, or disabled by using the =, +=, -=, and ! operators
           respectively.  This list has no default members.

Итак, если вы хотите, чтобы он сохранил JAVA_HOME, добавьте его в env_keep:

Defaults   env_keep += "JAVA_HOME"

В качестве альтернативы , установите JAVA_HOMEв корне ~/.bash_profile.

кендырь
источник
2
Да, это было так. Не знал, что это можно сделать. Благодарность!
Джош
20

Запустите sudo с параметром -E (сохранить среду) (см. Файл man) или вставьте JAVA_HOME в скрипт install.sh.

mazianni
источник
Опция -E недоступна в CentOS.
Зубин